147 lines
4.9 KiB
C
147 lines
4.9 KiB
C
/******************************************************************************/
|
|
/* This program is free software; you can redistribute it and/or modify */
|
|
/* it under the terms of the GNU General Public License as published by */
|
|
/* the Free Software Foundation; either version 2 of the License, or */
|
|
/* (at your option) any later version. */
|
|
/* */
|
|
/* This program is distributed in the hope that it will be useful, */
|
|
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
|
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
|
|
/* the GNU General Public License for more details. */
|
|
/* */
|
|
/* You should have received a copy of the GNU General Public License */
|
|
/* along with this program; if not, write to the Free Software */
|
|
/* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
/* */
|
|
/******************************************************************************/
|
|
/*
|
|
* tomoyo_accept_test.c
|
|
*
|
|
* Testing program for security/tomoyo/
|
|
*
|
|
* Copyright (C) 2005-2010 NTT DATA CORPORATION
|
|
*/
|
|
#include "include.h"
|
|
|
|
static void set_level(const int i)
|
|
{
|
|
set_profile(i, "file::execute");
|
|
set_profile(i, "file::open");
|
|
set_profile(i, "file::create");
|
|
set_profile(i, "file::unlink");
|
|
set_profile(i, "file::mkdir");
|
|
set_profile(i, "file::rmdir");
|
|
set_profile(i, "file::mkfifo");
|
|
set_profile(i, "file::mksock");
|
|
set_profile(i, "file::truncate");
|
|
set_profile(i, "file::symlink");
|
|
set_profile(i, "file::rewrite");
|
|
set_profile(i, "file::mkblock");
|
|
set_profile(i, "file::mkchar");
|
|
set_profile(i, "file::link");
|
|
set_profile(i, "file::rename");
|
|
set_profile(i, "file::chmod");
|
|
set_profile(i, "file::chown");
|
|
set_profile(i, "file::chgrp");
|
|
set_profile(i, "file::ioctl");
|
|
set_profile(i, "file::chroot");
|
|
set_profile(i, "file::mount");
|
|
set_profile(i, "file::umount");
|
|
set_profile(i, "file::pivot_root");
|
|
}
|
|
|
|
static void test(int rw_loop, int truncate_loop, int append_loop,
|
|
int create_loop)
|
|
{
|
|
static const int rw_flags[4] = { 0, O_RDONLY, O_WRONLY, O_RDWR };
|
|
static const int create_flags[3] = { 0, O_CREAT /* nonexistent */ ,
|
|
O_CREAT /* existent */
|
|
};
|
|
static const int truncate_flags[2] = { 0, O_TRUNC };
|
|
static const int append_flags[2] = { 0, O_APPEND };
|
|
int level;
|
|
int flags;
|
|
int i;
|
|
int fd;
|
|
static char buffer[1024];
|
|
memset(buffer, 0, sizeof(buffer));
|
|
snprintf(buffer, sizeof(buffer) - 1, "/tmp/file:a=%d:t=%d:c=%d:m=%d",
|
|
append_loop, truncate_loop, create_loop, rw_loop);
|
|
fprintf(exception_fp, "deny_rewrite %s\n", buffer);
|
|
flags = rw_flags[rw_loop] | truncate_flags[truncate_loop] |
|
|
append_flags[append_loop] | create_flags[create_loop];
|
|
for (i = 1; i < 8; i++)
|
|
fprintf(domain_fp, "delete %d %s\n", i, buffer);
|
|
for (level = 0; level < 4; level++) {
|
|
set_level(0);
|
|
if (create_loop == 1)
|
|
unlink(buffer);
|
|
else
|
|
close(open(buffer, O_CREAT, 0644));
|
|
set_level(level);
|
|
fd = open(buffer, flags, 0644);
|
|
if (fd != EOF)
|
|
close(fd);
|
|
else
|
|
fprintf(stderr, "%d: open(%04o) failed\n", level,
|
|
flags);
|
|
/*
|
|
fd = open(buffer, flags, 0644)
|
|
if (fd != EOF)
|
|
close(fd);
|
|
else
|
|
fprintf(stderr, "%d: open(%04o) failed\n", level, flags);
|
|
*/
|
|
/*
|
|
fd = open(buffer, flags, 0644);
|
|
if (fd != EOF)
|
|
close(fd);
|
|
else
|
|
fprintf(stderr, "%d: open(%04o) failed\n", level, flags);
|
|
*/
|
|
}
|
|
for (i = 1; i < 8; i++)
|
|
fprintf(domain_fp, "delete %d %s\n", i, buffer);
|
|
fprintf(domain_fp, "delete allow_truncate %s\n", buffer);
|
|
fprintf(domain_fp, "delete allow_create %s 0644\n", buffer);
|
|
fprintf(domain_fp, "delete allow_rewrite %s\n", buffer);
|
|
fd = open(buffer, flags, 0644);
|
|
if (fd != EOF) {
|
|
close(fd);
|
|
fprintf(stderr, "%d: open(%04o) didn't fail\n", 3, flags);
|
|
}
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
tomoyo_test_init();
|
|
fprintf(profile_fp, "255-PREFERENCE::learning={ verbose=no }\n");
|
|
fprintf(profile_fp, "255-PREFERENCE::enforcing={ verbose=no }\n");
|
|
fprintf(profile_fp, "255-PREFERENCE::permissive={ verbose=no }\n");
|
|
fprintf(profile_fp, "255-PREFERENCE::disabled={ verbose=no }\n");
|
|
set_profile(0, "file");
|
|
fprintf(profile_fp, "255-PREFERENCE::learning={ max_entry=2048 }\n");
|
|
{
|
|
int append_loop;
|
|
for (append_loop = 0; append_loop < 2; append_loop++) {
|
|
int truncate_loop;
|
|
for (truncate_loop = 0; truncate_loop < 2;
|
|
truncate_loop++) {
|
|
int create_loop;
|
|
for (create_loop = 0; create_loop < 3;
|
|
create_loop++) {
|
|
int rw_loop;
|
|
for (rw_loop = 0; rw_loop < 4;
|
|
rw_loop++)
|
|
test(rw_loop, truncate_loop,
|
|
append_loop, create_loop);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
fprintf(profile_fp, "255-CONFIG::file=disabled\n");
|
|
printf("Done\n");
|
|
clear_status();
|
|
return 0;
|
|
}
|