1 /******************************************************************************/ 2 /* This program is free software; you can redistribute it and/or modify */ 3 /* it under the terms of the GNU General Public License as published by */ 4 /* the Free Software Foundation; either version 2 of the License, or */ 5 /* (at your option) any later version. */ 6 /* */ 7 /* This program is distributed in the hope that it will be useful, */ 8 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 9 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ 10 /* the GNU General Public License for more details. */ 11 /* */ 12 /* You should have received a copy of the GNU General Public License */ 13 /* along with this program; if not, write to the Free Software */ 14 /* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ 15 /* */ 16 /******************************************************************************/ 17 /* 18 * tomoyo_filesystem_test.c 19 * 20 * Testing program for security/tomoyo/ 21 * 22 * Copyright (C) 2005-2010 NTT DATA CORPORATION 23 */ 24 #define _GNU_SOURCE 25 #include "include.h" 26 27 static void show_prompt(const char *str, const int should_fail) 28 { 29 printf("Testing %60s: (%s) ", str, 30 should_fail ? "must fail" : "should success"); 31 errno = 0; 32 } 33 34 #ifndef MS_MOVE 35 #define MS_MOVE 8192 36 #endif 37 38 static const char *pivot_root_dir = "/sys/kernel/security/"; 39 40 static int child(void *arg) 41 { 42 errno = 0; 43 pivot_root(pivot_root_dir, proc_policy_dir); 44 return errno; 45 } 46 47 static void mount2(const char *source, const char *target, 48 const char *filesystemtype) 49 { 50 if (mount(source, target, filesystemtype, 0, NULL)) { 51 printf("BUG: mount() failed\n"); 52 fflush(stdout); 53 } 54 } 55 56 static const unsigned char compressed_ext2_image_sample[1350] = { 57 0x1F, 0x8B, 0x08, 0x00, 0xA8, 0xF2, 0x96, 0x4B, 0x02, 0x03, 0xED, 0xDC, 58 0x3D, 0x4B, 0x5B, 0x51, 0x18, 0x07, 0xF0, 0xE7, 0xDE, 0xAB, 0x14, 0x8C, 59 0xAB, 0xD5, 0x9A, 0xF8, 0x36, 0x0B, 0xA1, 0xE0, 0xE0, 0xDC, 0xD0, 0xAD, 60 0xD0, 0xC5, 0xAF, 0x50, 0x9C, 0x42, 0x1D, 0x6A, 0xE6, 0xA6, 0x9B, 0x9B, 61 0x8B, 0xD8, 0xA5, 0x5B, 0x97, 0x2E, 0xF9, 0x0E, 0x85, 0x4C, 0xF6, 0x23, 62 0x74, 0x70, 0x55, 0x28, 0x52, 0xA8, 0xDD, 0xED, 0xB9, 0xB9, 0xB1, 0xA6, 63 0xEA, 0x24, 0xA5, 0x81, 0xDE, 0xDF, 0x0F, 0x9E, 0xDC, 0xB7, 0x13, 0x2E, 64 0xF7, 0xC0, 0xFF, 0x70, 0xCE, 0x85, 0x24, 0x02, 0xA8, 0xAB, 0x7E, 0xF9, 65 0x31, 0x13, 0xB1, 0x95, 0x36, 0xA7, 0x45, 0x44, 0x2F, 0x6D, 0xB3, 0xC9, 66 0x06, 0xEB, 0x55, 0xF5, 0xC7, 0x87, 0x9F, 0x7E, 0x1C, 0xBF, 0x88, 0x68, 67 0xC5, 0xCE, 0xF7, 0x6C, 0xD4, 0x6E, 0x74, 0xFC, 0xF2, 0x62, 0x74, 0xED, 68 0xFA, 0x7B, 0x8D, 0xB8, 0x69, 0x9F, 0x8F, 0xCF, 0x9F, 0x1D, 0x7E, 0x78, 69 0xF7, 0x6D, 0xD8, 0x79, 0xFF, 0x71, 0xD0, 0xED, 0xBC, 0xCD, 0x9A, 0xBD, 70 0x69, 0x3C, 0xEB, 0xE0, 0xCB, 0xF0, 0xA4, 0xF9, 0xF5, 0xF9, 0xCA, 0xE0, 71 0xE0, 0x72, 0xBB, 0x7B, 0xD4, 0x1A, 0xE6, 0x13, 0xD7, 0xAA, 0xE7, 0x82, 72 0x7A, 0x29, 0xAA, 0xF8, 0xC7, 0xEC, 0x28, 0xFF, 0xBD, 0xC8, 0x75, 0x09, 73 0xD4, 0xC6, 0x55, 0x92, 0x4D, 0x71, 0xFA, 0x71, 0x05, 0x4C, 0xCF, 0xA3, 74 0xBB, 0xE3, 0x01, 0x50, 0x0F, 0x93, 0xEB, 0xDF, 0xEB, 0xFA, 0x97, 0x13, 75 0x80, 0x8B, 0x67, 0xD5, 0x02, 0xE4, 0xEE, 0xFD, 0x8B, 0x3F, 0xD6, 0x22, 76 0x0B, 0xA6, 0x6A, 0xC0, 0x5F, 0xF6, 0xB9, 0x1C, 0x7F, 0x9E, 0xDE, 0x37, 77 0xFE, 0xE4, 0xB1, 0x34, 0xD1, 0xEE, 0x71, 0xAA, 0xC5, 0x54, 0xE5, 0xB9, 78 0x27, 0xA9, 0x96, 0x53, 0x35, 0xA3, 0x7C, 0x13, 0x1A, 0xB1, 0x92, 0x6A, 79 0x35, 0xD5, 0xDA, 0xF8, 0x75, 0xE9, 0x86, 0x6E, 0x05, 0x00, 0x00, 0x00, 80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x81, 81 0xCA, 0xDF, 0xD8, 0xCF, 0x47, 0x96, 0xB7, 0x7F, 0xEF, 0xE7, 0x79, 0xBB, 82 0x5D, 0xFD, 0x87, 0xDF, 0x79, 0x31, 0x97, 0x77, 0xF7, 0xDE, 0xEC, 0x6F, 83 0xEE, 0xEE, 0xF5, 0x5E, 0xBF, 0xD2, 0x57, 0xF0, 0xBF, 0x69, 0xDC, 0xCA, 84 0xFF, 0xCF, 0xA2, 0xCA, 0x3F, 0x50, 0x13, 0x33, 0xBA, 0x00, 0xE4, 0x1F, 85 0x90, 0x7F, 0x40, 0xFE, 0x01, 0xF9, 0x07, 0xE4, 0x1F, 0x90, 0x7F, 0x40, 86 0xFE, 0x01, 0xF9, 0x07, 0xE4, 0x1F, 0x90, 0x7F, 0x00, 0x00, 0x00, 0x00, 87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 95 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFA, 0xF9, 0x05, 0x34, 0xF2, 169 0x14, 0x08, 0x00, 0x00, 0x10, 0x00 170 }; 171 172 int main(int argc, char *argv[]) 173 { 174 char c = 0; 175 tomoyo_test_init(); 176 177 /* Test mount(). */ 178 { 179 set_profile(3, "file::mount"); 180 show_prompt("mount('dev\\011name', '/', 'fs\\011name') ", 1); 181 if (mount("dev\tname", "/", "fs\tname", 0, NULL) == EOF && 182 errno == EPERM) 183 printf("OK: Permission denied.\n"); 184 else if (errno == ENODEV) 185 printf("OK: No such device.\n"); 186 else 187 printf("BUG: %s\n", strerror(errno)); 188 set_profile(1, "file::mount"); 189 show_prompt("mount('dev\\011name', '/', 'fs\\011name') ", 0); 190 if (mount("dev\tname", "/", "fs\tname", 0, NULL) == EOF && 191 errno == ENOMEM) 192 printf("OK: Out of memory.\n"); 193 else if (errno == ENODEV) 194 printf("OK: No such device.\n"); 195 else 196 printf("BUG: %s\n", strerror(errno)); 197 set_profile(3, "file::mount"); 198 show_prompt("mount('dev\\011name', '/', 'fs\\011name') ", 0); 199 if (mount("dev\tname", "/", "fs\tname", 0, NULL) == EOF && 200 errno == ENOMEM) 201 printf("OK: Out of memory.\n"); 202 else if (errno == ENODEV) 203 printf("OK: No such device.\n"); 204 else 205 printf("BUG: %s\n", strerror(errno)); 206 fprintf(domain_fp, "delete allow_mount dev\\011name / " 207 "fs\\011name 0\n"); 208 show_prompt("mount('dev\\011name', '/', 'fs\\011name') ", 1); 209 if (mount("dev\tname", "/", "fs\tname", 0, NULL) == EOF && 210 errno == EPERM) 211 printf("OK: Permission denied.\n"); 212 else if (errno == ENODEV) 213 printf("OK: No such device.\n"); 214 else 215 printf("BUG: %s\n", strerror(errno)); 216 set_profile(1, "file::mount"); 217 show_prompt("mount(NULL, '/', 'tmpfs') ", 0); 218 if (mount(NULL, "/", "tmpfs", 0, NULL)) 219 printf("BUG: %s\n", strerror(errno)); 220 else 221 printf("OK: Success\n"); 222 set_profile(3, "file::mount"); 223 show_prompt("mount(NULL, '/', 'tmpfs') ", 0); 224 if (mount(NULL, "/", "tmpfs", 0, NULL)) 225 printf("BUG: %s\n", strerror(errno)); 226 else 227 printf("OK: Success\n"); 228 show_prompt("mount('anydev', '/', 'tmpfs') ", 0); 229 if (mount("anydev", "/", "tmpfs", 0, NULL)) 230 printf("BUG: %s\n", strerror(errno)); 231 else 232 printf("OK: Success\n"); 233 fprintf(domain_fp, "delete allow_mount <NULL> / tmpfs 0\n"); 234 fprintf(domain_fp, "allow_mount anydev / tmpfs 0\n"); 235 show_prompt("mount(NULL, '/', 'tmpfs') ", 0); 236 if (mount(NULL, "/", "tmpfs", 0, NULL)) 237 printf("BUG: %s\n", strerror(errno)); 238 else 239 printf("OK: Success\n"); 240 fprintf(domain_fp, "delete allow_mount anydev / tmpfs 0\n"); 241 set_profile(2, "file::mount"); 242 show_prompt("mount(NULL, NULL, 'tmpfs') ", 1); 243 if (mount(NULL, NULL, "tmpfs", 0, NULL)) 244 printf("OK: %s\n", strerror(errno)); 245 else 246 printf("BUG: Did not fail.\n"); 247 show_prompt("mount(NULL, NULL, NULL) ", 1); 248 if (mount(NULL, NULL, NULL, 0, NULL)) 249 printf("OK: %s\n", strerror(errno)); 250 else 251 printf("BUG: Did not fail.\n"); 252 show_prompt("mount('/', NULL, NULL) ", 1); 253 if (mount("/", NULL, NULL, 0, NULL)) 254 printf("OK: %s\n", strerror(errno)); 255 else 256 printf("BUG: Did not fail.\n"); 257 show_prompt("mount('/', NULL, 'tmpfs') ", 1); 258 if (mount("/", NULL, "tmpfs", 0, NULL)) 259 printf("OK: %s\n", strerror(errno)); 260 else 261 printf("BUG: Did not fail.\n"); 262 show_prompt("mount('/', '/', 'nonexistentfs') ", 1); 263 if (mount("/", "/", "nonexistentfs", 0, NULL)) 264 printf("OK: %s\n", strerror(errno)); 265 else 266 printf("BUG: Did not fail.\n"); 267 set_profile(0, "file::mount"); 268 } 269 270 mkdir("/tmp/mount/", 0755); 271 mkdir("/tmp/mount_bind/", 0755); 272 mkdir("/tmp/mount_move/", 0755); 273 274 /* Test mount(). */ 275 { 276 static char buf[4096]; 277 char *dev_ram_path = realpath("/dev/ram0", NULL); 278 if (!dev_ram_path) 279 dev_ram_path = realpath("/dev/ram", NULL); 280 if (!dev_ram_path) { 281 dev_ram_path = "/dev/ram0"; 282 mknod(dev_ram_path, S_IFBLK, MKDEV(1, 0)); 283 } 284 memset(buf, 0, sizeof(buf)); 285 { 286 struct stat sbuf; 287 FILE *fp = NULL; 288 snprintf(buf, sizeof(buf) - 1, "zcat - > %s", 289 dev_ram_path); 290 if (lstat(dev_ram_path, &sbuf) == 0 && 291 S_ISBLK(sbuf.st_mode) && MAJOR(sbuf.st_rdev) == 1) 292 fp = popen(buf, "w"); 293 if (fp) { 294 if (fwrite(compressed_ext2_image_sample, 1, 295 sizeof(compressed_ext2_image_sample), 296 fp) != 297 sizeof(compressed_ext2_image_sample)) 298 err(1, "fwrite"); 299 pclose(fp); 300 } else 301 fprintf(stderr, "Can't write to %s .\n", 302 dev_ram_path); 303 } 304 set_profile(3, "file::mount"); 305 306 /* Test standard case */ 307 show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " 308 "'/tmp/mount/'", 1); 309 if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == EOF && 310 errno == EPERM) 311 printf("OK: Permission denied.\n"); 312 else 313 printf("BUG: %s\n", strerror(errno)); 314 315 /* Test device_name with pattern */ 316 snprintf(buf, sizeof(buf) - 1, "mount('%s', '/tmp/mount/', " 317 "'ext2') for '%s\\*'", dev_ram_path, dev_ram_path); 318 show_prompt(buf, 1); 319 if (mount(dev_ram_path, "/tmp/mount/", "ext2", MS_RDONLY, NULL) 320 == EOF && errno == EPERM) 321 printf("OK: Permission denied.\n"); 322 else 323 printf("BUG: %s\n", strerror(errno)); 324 325 /* Test dir_name with pattern */ 326 show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " 327 "'/tmp/\\?\\?\\?\\?\\?/'", 1); 328 if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == EOF && 329 errno == EPERM) 330 printf("OK: Permission denied.\n"); 331 else 332 printf("BUG: %s\n", strerror(errno)); 333 334 /* Test standard case */ 335 fprintf(domain_fp, "allow_mount none /tmp/mount/ tmpfs 0\n"); 336 show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " 337 "'/tmp/mount/'", 0); 338 if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == 0) 339 printf("OK\n"); 340 else 341 printf("FAILED: %s\n", strerror(errno)); 342 fprintf(domain_fp, 343 "delete allow_mount none /tmp/mount/ tmpfs 0\n"); 344 345 /* Test device_name with pattern */ 346 fprintf(domain_fp, "allow_mount %s\\* /tmp/mount/ ext2 1\n", 347 dev_ram_path); 348 snprintf(buf, sizeof(buf) - 1, "mount('%s', '/tmp/mount/', " 349 "'ext2') for '%s\\*'", dev_ram_path, dev_ram_path); 350 show_prompt(buf, 0); 351 if (mount(dev_ram_path, "/tmp/mount/", "ext2", MS_RDONLY, NULL) 352 == 0) 353 printf("OK\n"); 354 else 355 printf("FAILED: %s\n", strerror(errno)); 356 fprintf(domain_fp, "delete allow_mount %s\\* " 357 "/tmp/mount/ ext2 1\n", dev_ram_path); 358 359 /* Test dir_name with pattern */ 360 fprintf(domain_fp, 361 "allow_mount none /tmp/\\?\\?\\?\\?\\?/ tmpfs 0\n"); 362 show_prompt("mount('none', '/tmp/mount/', 'tmpfs') for " 363 "'/tmp/\\?\\?\\?\\?\\?/'", 0); 364 if (mount("none", "/tmp/mount/", "tmpfs", 0, NULL) == 0) 365 printf("OK\n"); 366 else 367 printf("FAILED: %s\n", strerror(errno)); 368 fprintf(domain_fp, "delete allow_mount none " 369 "/tmp/\\?\\?\\?\\?\\?/ tmpfs 0\n"); 370 371 set_profile(0, "file::mount"); 372 while (umount("/tmp/mount/") == 0) 373 c++; /* Dummy. */ 374 } 375 376 /* Test mount(). */ 377 { 378 mount2("none", "/tmp/mount/", "tmpfs"); 379 set_profile(3, "file::mount"); 380 381 /* Test remount case */ 382 show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 1); 383 if (mount("none", "/tmp/mount/", "tmpfs", MS_REMOUNT, NULL) 384 == EOF && errno == EPERM) 385 printf("OK: Permission denied.\n"); 386 else 387 printf("BUG: %s\n", strerror(errno)); 388 show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 1); 389 if (mount(NULL, "/tmp/mount/", NULL, MS_REMOUNT, NULL) == EOF 390 && errno == EPERM) 391 printf("OK: Permission denied.\n"); 392 else 393 printf("BUG: %s\n", strerror(errno)); 394 fprintf(domain_fp, "allow_mount something /tmp/mount/ " 395 "--remount 0\n"); 396 show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 0); 397 if (mount(NULL, "/tmp/mount/", NULL, MS_REMOUNT, NULL)) 398 printf("BUG: %s\n", strerror(errno)); 399 else 400 printf("OK: Success.\n"); 401 fprintf(domain_fp, "delete allow_mount something /tmp/mount/ " 402 "--remount 0\n"); 403 404 /* Test bind case */ 405 show_prompt("mount('/tmp/mount/', '/tmp/mount_bind/', " 406 "MS_BIND)", 1); 407 if (mount("/tmp/mount/", "/tmp/mount_bind/", NULL, MS_BIND, 408 NULL) == EOF && errno == EPERM) 409 printf("OK: Permission denied.\n"); 410 else 411 printf("BUG: %s\n", strerror(errno)); 412 413 /* Test move case */ 414 show_prompt("mount('/tmp/mount/', '/tmp/mount_move/', " 415 "MS_MOVE)", 1); 416 if (mount("/tmp/mount/", "/tmp/mount_move/", NULL, MS_MOVE, 417 NULL) == EOF && errno == EPERM) 418 printf("OK: Permission denied.\n"); 419 else 420 printf("BUG: %s\n", strerror(errno)); 421 422 /* Test remount case */ 423 fprintf(domain_fp, "allow_mount any /tmp/mount/ --remount 0\n"); 424 show_prompt("mount('/tmp/mount/', MS_REMOUNT)", 0); 425 if (mount("none", "/tmp/mount/", "tmpfs", MS_REMOUNT, NULL) 426 == 0) 427 printf("OK\n"); 428 else 429 printf("FAILED: %s\n", strerror(errno)); 430 fprintf(domain_fp, "delete allow_mount any /tmp/mount/ " 431 "--remount 0\n"); 432 433 /* Test bind case */ 434 fprintf(domain_fp, 435 "allow_mount /tmp/mount/ /tmp/mount_bind/ --bind 0\n"); 436 show_prompt("mount('/tmp/mount/', '/tmp/mount_bind', MS_BIND)", 437 0); 438 if (mount("/tmp/mount/", "/tmp/mount_bind/", NULL, MS_BIND, 439 NULL) == 0) 440 printf("OK\n"); 441 else 442 printf("FAILED: %s\n", strerror(errno)); 443 set_profile(0, "file::mount"); 444 umount("/tmp/mount_bind/"); 445 fprintf(domain_fp, "delete allow_mount /tmp/mount/ " 446 "/tmp/mount_bind/ --bind 0\n"); 447 448 /* Test move case */ 449 set_profile(3, "file::mount"); 450 fprintf(domain_fp, "allow_unmount /tmp/mount/\n"); 451 fprintf(domain_fp, "allow_mount /tmp/mount/ /tmp/mount_move/ " 452 "--move 0\n"); 453 show_prompt("mount('/tmp/mount/', '/tmp/mount_move/', " 454 "MS_MOVE)", 0); 455 if (mount("/tmp/mount/", "/tmp/mount_move/", NULL, MS_MOVE, 456 NULL) == 0) 457 printf("OK\n"); 458 else 459 printf("FAILED: %s\n", strerror(errno)); 460 set_profile(0, "file::mount"); 461 umount("/tmp/mount_move/"); 462 fprintf(domain_fp, "delete allow_unmount /tmp/mount/\n"); 463 fprintf(domain_fp, "delete allow_mount /tmp/mount/ " 464 "/tmp/mount_move/ --move 0\n"); 465 466 while (umount("/tmp/mount/") == 0) 467 c++; /* Dummy. */ 468 } 469 470 /* Test umount(). */ 471 { 472 /* Test standard case */ 473 fprintf(domain_fp, "allow_unmount /tmp/mount/\n"); 474 475 set_profile(0, "file::umount"); 476 mount2("none", "/tmp/mount/", "tmpfs"); 477 set_profile(3, "file::umount"); 478 show_prompt("umount('/tmp/mount/') for '/tmp/mount/'", 0); 479 if (umount("/tmp/mount/") == 0) 480 printf("OK\n"); 481 else 482 printf("BUG: %s\n", strerror(errno)); 483 fprintf(domain_fp, "delete allow_unmount /tmp/mount/\n"); 484 485 set_profile(0, "file::umount"); 486 487 mount2("none", "/tmp/mount/", "tmpfs"); 488 set_profile(3, "file::umount"); 489 show_prompt("umount('/tmp/mount/') for '/tmp/mount/'", 1); 490 if (umount("/tmp/mount/") == EOF && errno == EPERM) 491 printf("OK: Permission denied.\n"); 492 else 493 printf("FAILED: %s\n", strerror(errno)); 494 495 /* Test pattern */ 496 fprintf(domain_fp, "allow_unmount /tmp/\\?\\?\\?\\?\\?/\n"); 497 set_profile(0, "file::umount"); 498 mount2("none", "/tmp/mount/", "tmpfs"); 499 set_profile(3, "file::umount"); 500 show_prompt("umount('/tmp/mount/') for " 501 "'/tmp/\\?\\?\\?\\?\\?/'", 1); 502 if (umount("/tmp/mount/") == 0) 503 printf("OK\n"); 504 else 505 printf("BUG: %s\n", strerror(errno)); 506 fprintf(domain_fp, 507 "delete allow_unmount /tmp/\\?\\?\\?\\?\\?/\n"); 508 509 set_profile(0, "file::umount"); 510 while (umount("/tmp/mount/") == 0) 511 c++; /* Dummy. */ 512 } 513 514 /* Test chroot(). */ 515 { 516 set_profile(3, "file::chroot"); 517 518 /* Test standard case */ 519 fprintf(domain_fp, "allow_chroot /tmp/mount/\n"); 520 show_prompt("chroot('/tmp/mount/') for '/tmp/mount/'", 0); 521 fflush(stdout); 522 if (fork() == 0) { 523 if (chroot("/tmp/mount/") == 0) 524 printf("OK\n"); 525 else 526 printf("FAILED: %s\n", strerror(errno)); 527 fflush(stdout); 528 _exit(0); 529 } 530 wait(NULL); 531 fprintf(domain_fp, "delete allow_chroot /tmp/mount/\n"); 532 533 show_prompt("chroot('/tmp/mount/') for '/tmp/mount/'", 1); 534 fflush(stdout); 535 if (fork() == 0) { 536 if (chroot("/tmp/mount/") == EOF && errno == EPERM) 537 printf("OK: Permission denied.\n"); 538 else 539 printf("BUG: %s\n", strerror(errno)); 540 fflush(stdout); 541 _exit(0); 542 } 543 wait(NULL); 544 545 /* Test pattern */ 546 fprintf(domain_fp, "allow_chroot /tmp/\\?\\?\\?\\?\\?/\n"); 547 show_prompt("chroot('/tmp/mount/') for " 548 "'/tmp/\\?\\?\\?\\?\\?/'", 0); 549 fflush(stdout); 550 if (fork() == 0) { 551 if (chroot("/tmp/mount/") == 0) 552 printf("OK\n"); 553 else 554 printf("FAILED: %s\n", strerror(errno)); 555 fflush(stdout); 556 _exit(0); 557 } 558 wait(NULL); 559 fprintf(domain_fp, 560 "delete allow_chroot /tmp/\\?\\?\\?\\?\\?/\n"); 561 562 set_profile(0, "file::chroot"); 563 } 564 565 /* Test pivot_root(). */ 566 { 567 int error; 568 static char stack[8192]; 569 set_profile(3, "file::pivot_root"); 570 fprintf(domain_fp, "allow_pivot_root %s %s\n", 571 pivot_root_dir, proc_policy_dir); 572 snprintf(stack, 8191, "pivot_root('%s', '%s')", pivot_root_dir, 573 proc_policy_dir); 574 show_prompt(stack, 0); 575 { 576 const pid_t pid = ltp_clone_quick(CLONE_NEWNS, child, 577 NULL); 578 while (waitpid(pid, &error, __WALL) == EOF && 579 errno == EINTR) 580 c++; /* Dummy. */ 581 } 582 errno = WIFEXITED(error) ? WEXITSTATUS(error) : -1; 583 if (errno == 0) 584 printf("OK\n"); 585 else 586 printf("FAILED: %s\n", strerror(errno)); 587 588 fprintf(domain_fp, "delete allow_pivot_root %s %s\n", 589 pivot_root_dir, proc_policy_dir); 590 snprintf(stack, 8191, "pivot_root('%s', '%s')", pivot_root_dir, 591 proc_policy_dir); 592 show_prompt(stack, 1); 593 { 594 const pid_t pid = ltp_clone_quick(CLONE_NEWNS, child, 595 NULL); 596 while (waitpid(pid, &error, __WALL) == EOF && 597 errno == EINTR) 598 c++; /* Dummy. */ 599 } 600 errno = WIFEXITED(error) ? WEXITSTATUS(error) : -1; 601 if (errno == EPERM) 602 printf("OK: Permission denied.\n"); 603 else 604 printf("BUG: %s\n", strerror(errno)); 605 606 set_profile(2, "file::pivot_root"); 607 snprintf(stack, 8191, "pivot_root('%s', '%s')", pivot_root_dir, 608 proc_policy_dir); 609 show_prompt(stack, 0); 610 { 611 const pid_t pid = ltp_clone_quick(CLONE_NEWNS, child, 612 NULL); 613 while (waitpid(pid, &error, __WALL) == EOF && 614 errno == EINTR) 615 c++; /* Dummy. */ 616 } 617 errno = WIFEXITED(error) ? WEXITSTATUS(error) : -1; 618 if (errno == 0) 619 printf("OK\n"); 620 else 621 printf("FAILED: %s\n", strerror(errno)); 622 623 set_profile(0, "file::pivot_root"); 624 625 } 626 627 rmdir("/tmp/mount_move/"); 628 rmdir("/tmp/mount_bind/"); 629 rmdir("/tmp/mount/"); 630 631 clear_status(); 632 return 0; 633 } 634