アプリケーションが誤って使用されないように保護するために、その構成ファイルに正しいアクセス許可があることを確認しようとしています。これにより、アプリケーションはファイルの内容が他の誰かによって変更されていないことを信頼できます。
私は次の規則が正しいと信じています。
- ファイルは他の人が書き込み可能であってはなりません
- ファイルは信頼できるユーザー/グループが所有している必要があります: 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 のみをチェックしますが、グループの書き込みビットをチェックします。
よろしく。