メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C: Rec.POS05-C

Limit access to files by creating a jail

説明

ルール定義

jail を作成してファイルへのアクセスを制限します。1

Polyspace 実装

ルール チェッカーは、"chroot の後に chdir を実行せずにファイルが操作されました" をチェックします。

すべて展開する

問題

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

リスク

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

修正方法

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

例 - 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");  //Noncompliant
    res = fopen(log_path, "r");  //Noncompliant
    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;
}

チェック情報

グループ: Rec.50.POSIX (POS)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.