オープンソース・ソフトウェアの開発とダウンロード

Subversion リポジトリの参照

Annotation of /trunk/2.4.x/tomoyo-tools/kernel_test/tomoyo_new_file_test.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1664 - (hide annotations) (download) (as text)
Tue Oct 7 08:40:37 2008 UTC (15 years, 6 months ago) by kumaneko
Original Path: trunk/1.6.x/ccs-tools/ccstools/kernel_test/tomoyo_new_file_test.c
File MIME type: text/x-csrc
File size: 14479 byte(s)


1 kumaneko 1066 /*
2     * tomoyo_file_test.c
3     *
4     * Testing program for fs/tomoyo_file.c
5     *
6     * Copyright (C) 2005-2008 NTT DATA CORPORATION
7     *
8 kumaneko 1664 * Version: 1.6.5-pre 2008/10/07
9 kumaneko 1066 *
10     */
11     #include "include.h"
12    
13     static int profile_fd = EOF;
14     static int domain_fd = EOF;
15 kumaneko 1067 static int exception_fd = EOF;
16 kumaneko 1066 static const char *policy = "";
17     static char self_domain[4096] = "";
18    
19     static int write_policy(void) {
20     FILE *fp;
21     char buffer[8192];
22     char *cp;
23     int domain_found = 0;
24     int policy_found = 0;
25     memset(buffer, 0, sizeof(buffer));
26     cp = "255-MAC_FOR_FILE=disabled\n";
27     write(profile_fd, cp, strlen(cp));
28     fp = fopen(proc_policy_domain_policy, "r");
29     cp = "255-MAC_FOR_FILE=enforcing\n";
30     write(profile_fd, cp, strlen(cp));
31     write(domain_fd, policy, strlen(policy));
32     write(domain_fd, "\n", 1);
33     if (!fp) {
34     printf("%s : BUG: policy read failed\n", policy);
35     return 0;
36     }
37     while (fgets(buffer, sizeof(buffer) - 1, fp)) {
38     cp = strchr(buffer, '\n');
39     if (cp) *cp = '\0';
40     if (!strncmp(buffer, "<kernel>", 8)) domain_found = !strcmp(self_domain, buffer);
41     if (domain_found) {
42     //printf("<%s>\n", buffer);
43     if (!strcmp(buffer, policy)) {
44     policy_found = 1;
45     break;
46     }
47     }
48     }
49     fclose(fp);
50     if (!policy_found) {
51     printf("%s : BUG: policy write failed\n", policy);
52     return 0;
53     }
54     errno = 0;
55     return 1;
56     }
57    
58     static void delete_policy(void) {
59     write(domain_fd, "delete ", 7);
60     write(domain_fd, policy, strlen(policy));
61     write(domain_fd, "\n", 1);
62     }
63    
64     static void show_result(int result, char should_success) {
65     int err = errno;
66     printf("%s : ", policy);
67     if (should_success) {
68     if (result != EOF) printf("OK\n");
69     else printf("FAILED: %s\n", strerror(err));
70     } else {
71     if (result == EOF) {
72     if (err == EPERM) printf("OK: Permission denied.\n");
73     else printf("FAILED: %s\n", strerror(err));
74     } else {
75     printf("BUG: didn't fail.\n");
76     }
77     }
78     }
79    
80     static void create2(const char *pathname) {
81     const char *cp = "255-MAC_FOR_FILE=disabled\n";
82     write(profile_fd, cp, strlen(cp));
83     close(creat(pathname, 0600));
84     cp = "255-MAC_FOR_FILE=enforcing\n";
85     write(profile_fd, cp, strlen(cp));
86 kumaneko 1148 errno = 0;
87 kumaneko 1066 }
88    
89     static void mkdir2(const char *pathname) {
90     const char *cp = "255-MAC_FOR_FILE=disabled\n";
91     write(profile_fd, cp, strlen(cp));
92     mkdir(pathname, 0600);
93     cp = "255-MAC_FOR_FILE=enforcing\n";
94     write(profile_fd, cp, strlen(cp));
95 kumaneko 1148 errno = 0;
96 kumaneko 1066 }
97    
98     static void unlink2(const char *pathname) {
99     const char *cp = "255-MAC_FOR_FILE=disabled\n";
100     write(profile_fd, cp, strlen(cp));
101     unlink(pathname);
102     cp = "255-MAC_FOR_FILE=enforcing\n";
103     write(profile_fd, cp, strlen(cp));
104 kumaneko 1148 errno = 0;
105 kumaneko 1066 }
106    
107     static void rmdir2(const char *pathname) {
108     const char *cp = "255-MAC_FOR_FILE=disabled\n";
109     write(profile_fd, cp, strlen(cp));
110     rmdir(pathname);
111     cp = "255-MAC_FOR_FILE=enforcing\n";
112     write(profile_fd, cp, strlen(cp));
113 kumaneko 1148 errno = 0;
114 kumaneko 1066 }
115    
116     static void StageFileTest(void) {
117     char *filename = "";
118 kumaneko 1664 policy = "allow_read /proc/sys/net/ipv4/ip_local_port_range if task.uid=0 task.gid=0";
119 kumaneko 1066 if (write_policy()) {
120     static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
121     int buffer[2] = { 32768, 61000 };
122     size_t size = sizeof(buffer);
123     show_result(sysctl(name, 3, buffer, &size, 0, 0), 1);
124     delete_policy();
125     show_result(sysctl(name, 3, buffer, &size, 0, 0), 0);
126     }
127 kumaneko 1664 policy = "allow_write /proc/sys/net/ipv4/ip_local_port_range if task.euid=0 0=0 1-100=10-1000";
128 kumaneko 1066 if (write_policy()) {
129     static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
130     int buffer[2] = { 32768, 61000 };
131     size_t size = sizeof(buffer);
132     show_result(sysctl(name, 3, 0, 0, buffer, size), 1);
133     delete_policy();
134     show_result(sysctl(name, 3, 0, 0, buffer, size), 0);
135     }
136 kumaneko 1664 policy = "allow_read/write /proc/sys/net/ipv4/ip_local_port_range if 1!=10-100";
137 kumaneko 1066 if (write_policy()) {
138     static int name[] = { CTL_NET, NET_IPV4, NET_IPV4_LOCAL_PORT_RANGE };
139     int buffer[2] = { 32768, 61000 };
140     size_t size = sizeof(buffer);
141     show_result(sysctl(name, 3, buffer, &size, buffer, size), 1);
142     delete_policy();
143     show_result(sysctl(name, 3, buffer, &size, buffer, size), 0);
144     }
145    
146 kumaneko 1664 policy = "allow_read /bin/true if path1.uid=0 path1.parent.uid=0 10=10-100";
147 kumaneko 1066 if (write_policy()) {
148     show_result(uselib("/bin/true"), 1);
149     delete_policy();
150     show_result(uselib("/bin/true"), 0);
151     }
152    
153 kumaneko 1664 policy = "allow_execute /bin/true if task.uid!=10 path1.parent.uid=0";
154 kumaneko 1066 if (write_policy()) {
155     int pipe_fd[2] = { EOF, EOF };
156     int err = 0;
157     fflush(stdout); fflush(stderr);
158     pipe(pipe_fd);
159     if (fork() == 0) {
160     execl("/bin/true", "/bin/true", NULL);
161     err = errno;
162     write(pipe_fd[1], &err, sizeof(err));
163     _exit(0);
164     }
165     close(pipe_fd[1]);
166     read(pipe_fd[0], &err, sizeof(err));
167     close(pipe_fd[0]);
168     wait(NULL);
169     errno = err;
170     show_result(err ? EOF : 0, 1);
171     delete_policy();
172     fflush(stdout); fflush(stderr);
173     pipe(pipe_fd);
174     if (fork() == 0) {
175     execl("/bin/true", "/bin/true", NULL);
176     err = errno;
177     write(pipe_fd[1], &err, sizeof(err));
178     _exit(0);
179     }
180     close(pipe_fd[1]);
181     read(pipe_fd[0], &err, sizeof(err));
182     close(pipe_fd[0]);
183     wait(NULL);
184     errno = err;
185     show_result(err ? EOF : 0, 0);
186     }
187    
188 kumaneko 1664 policy = "allow_read /dev/null if path1.parent.ino=path1.parent.ino";
189 kumaneko 1066 if (write_policy()) {
190     int fd = open("/dev/null", O_RDONLY);
191     show_result(fd, 1);
192     if (fd != EOF) close(fd);
193     delete_policy();
194     fd = open("/dev/null", O_RDONLY);
195     show_result(fd, 0);
196     if (fd != EOF) close(fd);
197     }
198    
199 kumaneko 1664 policy = "allow_write /dev/null if path1.uid=path1.gid";
200 kumaneko 1066 if (write_policy()) {
201     int fd = open("/dev/null", O_WRONLY);
202     show_result(fd, 1);
203     if (fd != EOF) close(fd);
204     delete_policy();
205     fd = open("/dev/null", O_WRONLY);
206     show_result(fd, 0);
207     if (fd != EOF) close(fd);
208     }
209    
210 kumaneko 1664 policy = "allow_read/write /dev/null if task.uid=path1.parent.uid";
211 kumaneko 1066 if (write_policy()) {
212     int fd = open("/dev/null", O_RDWR);
213     show_result(fd, 1);
214     if (fd != EOF) close(fd);
215     delete_policy();
216     fd = open("/dev/null", O_RDWR);
217     show_result(fd, 0);
218     if (fd != EOF) close(fd);
219     }
220    
221 kumaneko 1664 policy = "allow_create /tmp/open_test if path1.parent.uid=task.uid";
222 kumaneko 1066 if (write_policy()) {
223 kumaneko 1664 policy = "allow_write /tmp/open_test if path1.parent.uid=0";
224 kumaneko 1066 if (write_policy()) {
225     int fd = open("/tmp/open_test", O_WRONLY | O_CREAT | O_EXCL, 0666);
226     show_result(fd, 1);
227     if (fd != EOF) close(fd);
228     unlink2("/tmp/open_test");
229     delete_policy();
230     fd = open("/tmp/open_test", O_WRONLY | O_CREAT | O_EXCL, 0666);
231     show_result(fd, 0);
232     if (fd != EOF) close(fd);
233     unlink2("/tmp/open_test");
234     }
235 kumaneko 1664 policy = "allow_create /tmp/open_test if path1.parent.uid=task.uid\n";
236 kumaneko 1066 delete_policy();
237     }
238    
239 kumaneko 1664 policy = "allow_write /tmp/open_test if task.uid=0 path1.ino!=0";
240 kumaneko 1066 if (write_policy()) {
241 kumaneko 1664 policy = "allow_create /tmp/open_test if 0=0";
242 kumaneko 1066 if (write_policy()) {
243     int fd = open("/tmp/open_test", O_WRONLY | O_CREAT | O_EXCL, 0666);
244     show_result(fd, 1);
245     if (fd != EOF) close(fd);
246     unlink2("/tmp/open_test");
247     delete_policy();
248     fd = open("/tmp/open_test", O_WRONLY | O_CREAT | O_EXCL, 0666);
249     show_result(fd, 0);
250     if (fd != EOF) close(fd);
251     unlink2("/tmp/open_test");
252     }
253 kumaneko 1664 policy = "allow_write /tmp/open_test if task.uid=0 path1.ino!=0\n";
254 kumaneko 1066 delete_policy();
255     }
256    
257     filename = "/tmp/truncate_test";
258     create2(filename);
259    
260 kumaneko 1664 policy = "allow_truncate /tmp/truncate_test if task.uid=path1.uid";
261 kumaneko 1066 if (write_policy()) {
262 kumaneko 1664 policy = "allow_write /tmp/truncate_test if 1!=100-1000000";
263 kumaneko 1066 if (write_policy()) {
264     int fd = open(filename, O_WRONLY | O_TRUNC);
265     show_result(fd, 1);
266     if (fd != EOF) close(fd);
267     delete_policy();
268     fd = open(filename, O_WRONLY | O_TRUNC);
269     show_result(fd, 0);
270     if (fd != EOF) close(fd);
271     }
272 kumaneko 1664 policy = "allow_truncate /tmp/truncate_test if task.uid=path1.uid";
273 kumaneko 1066 delete_policy();
274     }
275    
276     policy = "allow_write /tmp/truncate_test";
277     if (write_policy()) {
278     policy = "allow_truncate /tmp/truncate_test";
279     if (write_policy()) {
280     int fd = open(filename, O_WRONLY | O_TRUNC);
281     show_result(fd, 1);
282     if (fd != EOF) close(fd);
283     delete_policy();
284     fd = open(filename, O_WRONLY | O_TRUNC);
285     show_result(fd, 0);
286     if (fd != EOF) close(fd);
287     }
288     policy = "allow_write /tmp/truncate_test\n";
289     delete_policy();
290     }
291    
292     policy = "allow_truncate /tmp/truncate_test";
293     if (write_policy()) {
294     show_result(truncate(filename, 0), 1);
295     delete_policy();
296     show_result(truncate(filename, 0), 0);
297     }
298    
299     policy = "allow_truncate /tmp/truncate_test";
300     if (write_policy()) {
301     int fd;
302     const char *cp = "255-MAC_FOR_FILE=disabled\n";
303     write(profile_fd, cp, strlen(cp));
304     fd = open(filename, O_WRONLY);
305     cp = "255-MAC_FOR_FILE=enforcing\n";
306     write(profile_fd, cp, strlen(cp));
307     show_result(ftruncate(fd, 0), 1);
308     delete_policy();
309     show_result(ftruncate(fd, 0), 0);
310     if (fd != EOF) close(fd);
311     }
312    
313     unlink2(filename);
314    
315     policy = "allow_create /tmp/mknod_reg_test";
316     if (write_policy()) {
317     filename = "/tmp/mknod_reg_test";
318     show_result(mknod(filename, S_IFREG, 0), 1);
319     delete_policy();
320     unlink2(filename);
321     show_result(mknod(filename, S_IFREG, 0), 0);
322     }
323    
324     policy = "allow_mkchar /tmp/mknod_chr_test";
325     if (write_policy()) {
326     filename = "/tmp/mknod_chr_test";
327     show_result(mknod(filename, S_IFCHR, MKDEV(1, 3)), 1);
328     delete_policy();
329     unlink2(filename);
330     show_result(mknod(filename, S_IFCHR, MKDEV(1, 3)), 0);
331     }
332    
333     policy = "allow_mkblock /tmp/mknod_blk_test";
334     if (write_policy()) {
335     filename = "/tmp/mknod_blk_test";
336     show_result(mknod(filename, S_IFBLK, MKDEV(1, 0)), 1);
337     delete_policy();
338     unlink2(filename);
339     show_result(mknod(filename, S_IFBLK, MKDEV(1, 0)), 0);
340     }
341    
342     policy = "allow_mkfifo /tmp/mknod_fifo_test";
343     if (write_policy()) {
344     filename = "/tmp/mknod_fifo_test";
345     show_result(mknod(filename, S_IFIFO, 0), 1);
346     delete_policy();
347     unlink2(filename);
348     show_result(mknod(filename, S_IFIFO, 0), 0);
349     }
350    
351     policy = "allow_mksock /tmp/mknod_sock_test";
352     if (write_policy()) {
353     filename = "/tmp/mknod_sock_test";
354     show_result(mknod(filename, S_IFSOCK, 0), 1);
355     delete_policy();
356     unlink2(filename);
357     show_result(mknod(filename, S_IFSOCK, 0), 0);
358     }
359    
360     policy = "allow_mkdir /tmp/mkdir_test/";
361     if (write_policy()) {
362     filename = "/tmp/mkdir_test";
363     show_result(mkdir(filename, 0600), 1);
364     delete_policy();
365     rmdir2(filename);
366     show_result(mkdir(filename, 0600), 0);
367     }
368    
369     policy = "allow_rmdir /tmp/rmdir_test/";
370     if (write_policy()) {
371     filename = "/tmp/rmdir_test";
372     mkdir2(filename);
373     show_result(rmdir(filename), 1);
374     delete_policy();
375     mkdir2(filename);
376     show_result(rmdir(filename), 0);
377     rmdir2(filename);
378     }
379    
380     policy = "allow_unlink /tmp/unlink_test";
381     if (write_policy()) {
382     filename = "/tmp/unlink_test";
383     create2(filename);
384     show_result(unlink(filename), 1);
385     delete_policy();
386     create2(filename);
387     show_result(unlink(filename), 0);
388     unlink2(filename);
389     }
390    
391     policy = "allow_symlink /tmp/symlink_source_test";
392     if (write_policy()) {
393     filename = "/tmp/symlink_source_test";
394     show_result(symlink("/tmp/symlink_dest_test", filename), 1);
395     delete_policy();
396     unlink2(filename);
397     show_result(symlink("/tmp/symlink_dest_test", filename), 0);
398     }
399    
400     policy = "allow_link /tmp/link_source_test /tmp/link_dest_test";
401     if (write_policy()) {
402     filename = "/tmp/link_source_test";
403     create2(filename);
404     show_result(link(filename, "/tmp/link_dest_test"), 1);
405     delete_policy();
406     unlink2("/tmp/link_dest_test");
407     show_result(link(filename, "/tmp/link_dest_test"), 0);
408     unlink2(filename);
409     }
410    
411     policy = "allow_rename /tmp/rename_source_test /tmp/rename_dest_test";
412     if (write_policy()) {
413     filename = "/tmp/rename_source_test";
414     create2(filename);
415     show_result(rename(filename, "/tmp/rename_dest_test"), 1);
416     delete_policy();
417     unlink2("/tmp/rename_dest_test");
418     create2(filename);
419     show_result(rename(filename, "/tmp/rename_dest_test"), 0);
420     unlink2(filename);
421     }
422    
423     policy = "allow_mksock /tmp/socket_test";
424     if (write_policy()) {
425     struct sockaddr_un addr;
426     int fd;
427     filename = "/tmp/socket_test";
428     memset(&addr, 0, sizeof(addr));
429     addr.sun_family = AF_UNIX;
430     strncpy(addr.sun_path, filename, sizeof(addr.sun_path) - 1);
431     fd = socket(AF_UNIX, SOCK_STREAM, 0);
432     show_result(bind(fd, (struct sockaddr *) &addr, sizeof(addr)), 1);
433     if (fd != EOF) close(fd);
434     delete_policy();
435     unlink2(filename);
436     fd = socket(AF_UNIX, SOCK_STREAM, 0);
437     show_result(bind(fd, (struct sockaddr *) &addr, sizeof(addr)), 0);
438     if (fd != EOF) close(fd);
439     }
440 kumaneko 1067
441     filename = "/tmp/rewrite_test";
442     create2(filename);
443     policy = "allow_read/write /tmp/rewrite_test";
444     if (write_policy()) {
445     char *cp = "deny_rewrite /tmp/rewrite_test\n";
446     write(exception_fd, cp, strlen(cp));
447     policy = "allow_truncate /tmp/rewrite_test";
448     if (write_policy()) {
449     int fd;
450    
451     fd = open(filename, O_RDONLY);
452     show_result(fd, 1);
453     if (fd != EOF) close(fd);
454    
455     fd = open(filename, O_WRONLY | O_APPEND);
456     show_result(fd, 1);
457     if (fd != EOF) close(fd);
458    
459     fd = open(filename, O_WRONLY);
460     show_result(fd, 0);
461     if (fd != EOF) close(fd);
462    
463     fd = open(filename, O_WRONLY | O_TRUNC);
464     show_result(fd, 0);
465     if (fd != EOF) close(fd);
466    
467     fd = open(filename, O_WRONLY | O_TRUNC | O_APPEND);
468     show_result(fd, 0);
469     if (fd != EOF) close(fd);
470    
471     show_result(truncate(filename, 0), 0);
472    
473     cp = "255-MAC_FOR_FILE=disabled\n";
474     write(profile_fd, cp, strlen(cp));
475     fd = open(filename, O_WRONLY | O_APPEND);
476     cp = "255-MAC_FOR_FILE=enforcing\n";
477     write(profile_fd, cp, strlen(cp));
478     show_result(ftruncate(fd, 0), 0);
479    
480     show_result(fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_APPEND), 0);
481     if (fd != EOF) close(fd);
482    
483     delete_policy();
484     }
485     policy = "allow_read/write /tmp/rewrite_test";
486     delete_policy();
487     cp = "delete deny_rewrite /tmp/rewrite_test\n";
488     write(exception_fd, cp, strlen(cp));
489     }
490     unlink2(filename);
491 kumaneko 1066 }
492    
493     int main(int argc, char *argv[]) {
494     char *cp;
495     Init();
496     profile_fd = open(proc_policy_profile, O_WRONLY);
497     domain_fd = open(proc_policy_domain_policy, O_WRONLY);
498 kumaneko 1067 exception_fd = open(proc_policy_exception_policy, O_WRONLY);
499 kumaneko 1066 {
500     int self_fd = open(proc_policy_self_domain, O_RDONLY);
501     memset(self_domain, 0, sizeof(self_domain));
502     read(self_fd, self_domain, sizeof(self_domain) - 1);
503     close(self_fd);
504     write(domain_fd, self_domain, strlen(self_domain));
505     cp = " /bin/true\n";
506     write(domain_fd, cp, strlen(cp));
507     write(domain_fd, self_domain, strlen(self_domain));
508     write(domain_fd, "\n", 1);
509     cp = "use_profile 255\n";
510     write(domain_fd, cp, strlen(cp));
511     }
512     cp = "255-MAX_REJECT_LOG=1024\n";
513     write(profile_fd, cp, strlen(cp));
514     StageFileTest();
515     cp = "use_profile 0\n";
516     write(domain_fd, cp, strlen(cp));
517     ClearStatus();
518     return 0;
519     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26