
CVE-2019-1663의 바이너리 분석 및 익스플로잇: Cisco 라우터 웹 관리의 버퍼 오버플로우로, 근본 원인, 익스플로잇 단계, ROP 가젯 발견을 포함합니다.
저자: Corentin Wolff
이 취약점은 0x0002BF64 함수에서 비롯되며, strcpy 함수를 잘못 사용하여 버퍼 오버플로우 공격에 취약하게 만듭니다. 명확성을 위해 이 함수는 Login으로 이름이 변경되었습니다. 아래는 문제를 보여주는 코드 조각입니다.
undefined4 Login(char *param_1, char *param_2, char *param_3, int param_4) { ... }
이 조각에서 strcpy 함수가 부적절하게 사용되어 버퍼 오버플로우 취약점이 발생합니다.
if (param_4 == 0) {
iVar2 = strncmp(acStack_fa, "enc=", 4);
if (iVar2 != 0) {
strcpy(acStack_15e, acStack_fa);
strcpy(acStack_1c2, param_2);
goto LAB_0002c264;
}
}
이 코드 부분은 사용자 이름을 확인합니다:
if (iVar2 != 0) {
syslog(6, "Web management login failed, user=%s\n", param_1);
}
매개변수 param_1은 사용자 이름 필드로 식별됩니다.
마찬가지로, param_2는 비밀번호에 해당하고, param_3은 httpd_user로 식별됩니다.
login_flag 변수는 연결 상태를 나타냅니다:
0 → 로그인 오류
1 → 관리자 로그인 성공
2 → 기존 세션으로 인해 관리자 로그인 거부됨
3 → 관리자 로그인 강제 로그아웃
이 취약점은 strcpy 함수의 부적절한 사용으로 인해 발생하는 버퍼 오버플로우입니다.
strcpy 함수는 소스 문자열의 크기를 대상 버퍼의 용량과 비교하지 않습니다. 이로 인해 인접한 메모리 영역이 덮어쓰여질 수 있습니다.
CVE-2019-1663은 특정 Cisco 라우터 모델에서 입력 크기 검증 부족을 악용합니다.
a. 길이 미확인: 정제되지 않은 사용자 입력이 strcpy로 전달됩니다.
b. 메모리 오버플로우: 초과 데이터가 중요한 메모리 영역을 덮어씁니다.
c. 임의 코드 실행: 공격자가 악성 코드를 주입하고 실행합니다.
d. 악용 요구사항: 라우터의 웹 구성 서버에 접근해야 합니다.
e. 영향: 권한 있는 접근을 통해 네트워크 스파이 활동, 트래픽 리디렉션, 악성코드 설치 또는 백도어가 가능합니다.
&enc=1&user=cisco&pwd=AAAA...AAAAZZZZ&sel_lang=EN
이로 인해 세그멘테이션 오류가 발생합니다. 최적의 버퍼 크기를 결정함으로써 공격자는 악성 코드를 주입하고 실행할 수 있습니다.
ibc.so.0/ELF/ARM)> disasm_address 0x00034410
Instructions
============
0x00034410: pop {r0, pc}
(libc.so.0/ELF/ARM)> disasm_address 0x00041304
Instructions
============
0x00041304: mov r2, r0
(libc.so.0/ELF/ARM)> search %mov r2, r0%
[INFO] Searching for gadgets: %mov r2, r0%
[INFO] File: libc.so.0
0x00041304: mov r2, r0; mov r0, sp; blx r2;
MITRE CWE-120: 입력 크기를 확인하지 않는 버퍼 복사
https://cwe.mitre.org/data/definitions/120.html
MITRE CWE-787: 경계를 벗어난 쓰기
https://cwe.mitre.org/data/definitions/787.html
OWASP 버퍼 오버플로우 개요
https://owasp.org/www-community/vulnerabilities/Buffer_Overflow
"버퍼 오버플로우" on Microsoft Learn
https://learn.microsoft.com/en-us/cpp/security/security-best-practices-for-c-cpp
CERT 안전 코딩 표준 - STR31-C
https://wiki.sei.cmu.edu/confluence/display/c/STR31-C.+Guarantee+that+storage+for+strings+has+sufficient+space+for+character+data+and+the+null+terminator
CVE-2019-1663 악용 - Quentin Kaiser의 분석 글
https://quentinkaiser.be/exploitdev/2019/08/30/exploit-cve-2019-1663