界: API Abuse

API は、呼び出し元と呼び出し先の間のコントラクトです。最も一般的な API の不正使用の形態は、呼び出し元がこのコントラクトの終わりを守らないことによって発生します。たとえば、プログラムが chroot() を呼び出した後に chdir() を呼び出すのに失敗すると、アクティブなルート ディレクトリを安全に変更する方法を指定したコントラクトに違反することになります。ライブラリの悪用のもう 1 つの良い例は、呼び出し先が信頼できる DNS 情報を呼び出し元に返すことを期待することです。この場合、呼び出し元は、呼び出し先の API の動作 (戻り値が認証目的に使用できること) についてある種の仮定をすることで、呼び出し先の 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