メインコンテンツ

chroot() の後に chdir("/") を実行せずにファイルが操作されました

chroot の呼び出し後に操作されたファイルの、パス関連の脆弱性

説明

この欠陥は、chroot によって作成された jail の外にあるファイル システムにアクセス可能な場合に発生します。chroot を呼び出すことにより、特定のファイル サブシステムへのアクセスを制限するファイル システム jail が作成されます。しかしこの jail は、chdir("/") を呼び出さないと効果がありません。

リスク

chroot jail を作成しても chdir("/") を呼び出さない場合、パスを引数として取るファイル操作関数は、jail 外部のファイルにアクセスできます。攻撃者は、依然として指定のサブシステム外にあるファイルを操作でき、chroot jail は無効になります。

修正方法

chroot を呼び出した後に chdir("/") を呼び出して、chroot jail のセキュリティを高めます。

すべて展開する

#include <unistd.h>
#include <stdio.h>

const char root_path[] = "/var/ftproot";
const char log_path[] = "file.log";
FILE* chrootmisuse() {
    FILE* res;
    chroot(root_path);
    chdir("base"); 
    res = fopen(log_path, "r"); 
    return res;
}

この例では、chroot を使用して chroot jail を作成しています。しかし、chroot jail を安全に使用するには、その後に chdir("\") を呼び出さなければなりません。この例では chdir("base") が呼び出されていますが、これは等価ではありません。Bug Finder は fopen にもフラグを立てます。脆弱な chroot jail 内で fopen がファイルを開いているためです。

修正 — chdir("/") を呼び出す

ファイルを開く前に、chdir("/") を呼び出します。

#include <unistd.h>
#include <stdio.h>

const char root_path[] = "/var/ftproot";
const char log_path[] = "file.log";
FILE* chrootmisuse() {
    FILE* res;
    chroot(root_path);
    chdir("/");    
    res = fopen(log_path, "r");
    return res;
}

結果情報

グループ: セキュリティ
言語: C | C++
既定値: オフ
コマンド ライン構文: CHROOT_MISUSE
影響度: Medium

バージョン履歴

R2015b で導入