9

アプリケーションが誤って使用されないように保護するために、その構成ファイルに正しいアクセス許可があることを確認しようとしています。これにより、アプリケーションはファイルの内容が他の誰かによって変更されていないことを信頼できます。

私は次の規則が正しいと信じています。

  • ファイルは他の人が書き込み可能であってはなりません
  • ファイルは信頼できるユーザー/グループが所有している必要があります: root または
  • ファイルは、アプリケーションを実行している有効なユーザー/グループによって所有されている必要があります (setuid プログラムを考えてください)。

ここに例があります:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

#include <string.h>
#include <errno.h>

static
int is_secure(const char *name)
{
    struct stat st;

    uid_t euid = geteuid();
    gid_t egid = getegid();

    if (stat(name, &st) != 0) {
        int err = errno;
        fprintf(stderr, "can't stat() '%s': %d (%s)\n", name, err, strerror(err));
        return 0;
    }

    /* writable by other: unsecure */
    if ((st.st_mode & S_IWOTH) != 0) {
        return 0;
    }

    /* not owned by group root and not owned by effective group: unsecure */
    if (st.st_gid != 0 && st.st_gid != egid) {
        return 0;
    }

    /* not owned by user root and not owned by effective user: unsecure */
    if (st.st_uid != 0 && st.st_uid != euid) {
        return 0;
    }

    return 1;
}

int
main(int argc, char *argv[])
{
    int i;

    for(i = 1; i < argc; i++) {
        printf("'%s' : %s\n", argv[i], is_secure(argv[i]) ? "sure" : "unsure");
    }

    return 0;
}

私の仮定がよくわからないので、誰かがファイルのアクセス許可チェックに抜け穴を残しているかどうかを確認できますか?

アップデート

sudoにはそのための機能があります: sudo_secure_path、1 つの uid/gid のみをチェックしますが、グループの書き込みビットをチェックします。

よろしく。

4

2 に答える 2

8

あなたのルールとコードは私には正しいように見えますが、実装に影響を与える可能性のある次のセキュリティ リスクに注意する必要があります。

  1. マシンへの物理アクセスまたは NFS/SMB アクセスを持つ攻撃者は、ルート権限を持つボックスでファイル システムをマウントし、ファイルを変更する可能性があります。
  2. 信頼できるユーザーまたはルートとして実行されている別のプログラムの脆弱性により、そのプログラムが悪用されてファイルが変更される可能性があります。
  3. セキュリティチェックを破るのに必要なのは、ファイルの特権設定を台無しにする不注意なユーザーまたはシステム管理者だけです. これは、バックアップやサムドライブへのコピーなどで発生するのを見てきました。
  4. また、ファイルが実行可能でないことを確認してください。これが構成ファイルで悪用される可能性がある例は考えられませんが、セキュリティに関する一般的なルールは、仕事に必要のない権限を与えないことです。

ご覧のとおり、これらはコードの制御下にある問題ではありません。したがって、構成ファイルが改ざんできないことを保証する前に、クライアントがこれらのリスクを認識していることを確認する必要があります。

于 2013-05-23T20:31:56.287 に答える
7

ディレクトリのアクセス許可も確認したいと思います。

ユーザーはmv、ディレクトリへの書き込みが許可されている場合、正しいユーザーに属する別のファイルに置き換えて、このファイルを置き換えることができます。

何かのようなもの:

sudo touch foo.conf
sudo touch foo.conf-insecure-sample
mv -f foo.conf-insecure-sample foo.conf
于 2013-05-24T09:39:03.187 に答える