계: API Abuse

API는 호출자와 피호출자 간의 계약입니다. 가장 흔한 형태의 API 오용은 호출자가 이 계약에서 자신의 몫을 이행하지 못하기 때문에 발생합니다. 예를 들어, 프로그램이 chroot()를 호출한 후 chdir()을 호출하지 못하면 활성 루트 디렉터리를 안전하게 변경하는 방법을 지정하는 계약을 위반하는 것입니다. 라이브러리 오용의 또 다른 좋은 예는 피호출자가 호출자에게 신뢰할 만한 DNS 정보를 반환할 것으로 예상하는 것입니다. 이 경우, 호출자는 자신의 행동에 대해 특정한 가정을 함으로써(반환 값이 인증 목적으로 사용될 것으로 예상) 피호출자 API를 오용합니다. 다른 쪽에서 호출자-피호출자 계약을 위반할 수도 있습니다. 예를 들어, 코더가 하위 클래스 SecureRandom을 지정하고 임의 값이 아닌 값을 반환하는 경우 계약을 위반하는 것입니다.

Directory Restriction

Abstract
chroot() 시스템 호출을 잘못 사용하면 공격자가 chroot jail을 빠져나갈 수 있습니다.
Explanation
chroot() 시스템 호출로 프로세스가 file system의 루트 디렉터리 개념을 변경할 수 있습니다. chroot()를 올바로 호출하면 프로세스가 새 루트 디렉터리에서 정의한 디렉터리 트리 외부의 파일에 접근할 수 없습니다. 그런 환경을 chroot jail이라고 하며 일반적으로 프로세스를 훔쳐 파일의 무단 접근에 사용할 가능성을 방지하기 위해 사용합니다. 예를 들어, 많은 FTP 서버를 chroot jail에서 실행하여 서버에서 새 취약점을 발견한 공격자가 시스템에서 암호 파일 또는 기타 민감한 파일을 다운로드하는 것을 방지합니다.

chroot()를 잘못 사용하면 공격자가 chroot jail을 빠져나갈 수 있습니다. chroot() 함수 호출은 프로세스의 현재 작업 디렉터리를 변경하지 않기 때문에 chroot()가 호출된 후에도 상대 경로가 chroot jail 외부의 file system 리소스를 참조할 수 있습니다.

예제 1: (가상의) FTP 서버의 다음 소스 코드를 보겠습니다.


chroot("/var/ftproot");
...
fgets(filename, sizeof(filename), network);
localfile = fopen(filename, "r");
while ((len = fread(buf, 1, sizeof(buf), localfile)) != EOF) {
fwrite(buf, 1, sizeof(buf), network);
}
fclose(localfile);


이 코드는 네트워크에서 파일 이름을 읽고 로컬 컴퓨터에서 파일을 연 다음 네트워크로 파일 내용을 보냅니다. 이 코드는 FTP GET 명령을 구현하는 데 사용할 수 있습니다. FTP 서버는 /var/ftproot 외부의 파일에 대한 접근을 막기 위해 초기화 루틴에서 chroot()를 호출합니다. 그러나 서버가 chdir("/")를 호출하여 현재 작업 디렉터리를 변경할 수 없기 때문에 공격자가 "../../../../../etc/passwd" 파일을 요청하여 시스템 암호 파일의 복사본을 얻을 수 있습니다.
References
[1] J. Viega, G. McGraw Building Secure Software Addison-Wesley
[2] A. Chuvakin Using Chroot Securely
[3] Standards Mapping - Common Weakness Enumeration CWE ID 243
[4] Standards Mapping - General Data Protection Regulation (GDPR) Access Violation
[5] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Directive 4.14
[6] Standards Mapping - OWASP Mobile 2014 M4 Unintended Data Leakage
[7] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-STORAGE-2
[8] Standards Mapping - Web Application Security Consortium Version 2.00 Insufficient Authorization (WASC-02)
[9] Standards Mapping - Web Application Security Consortium 24 + 2 Insufficient Authorization
desc.semantic.cpp.directory_restriction