2 * Copyright (c) 2018 Aniket Pandey
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38 static uid_t uid = -1;
39 static gid_t gid = -1;
41 static struct pollfd fds[1];
42 static mode_t mode = 0777;
43 static char extregex[80];
44 static const char *auclass = "fm";
45 static const char *path = "fileforaudit";
46 static const char *errpath = "adirhasnoname/fileforaudit";
47 static const char *successreg = "fileforaudit.*return,success";
48 static const char *failurereg = "fileforaudit.*return,failure";
51 ATF_TC_WITH_CLEANUP(flock_success);
52 ATF_TC_HEAD(flock_success, tc)
54 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
58 ATF_TC_BODY(flock_success, tc)
61 snprintf(extregex, sizeof(extregex), "flock.*%d.*return,success", pid);
63 /* File needs to exist to call flock(2) */
64 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
65 FILE *pipefd = setup(fds, auclass);
66 ATF_REQUIRE_EQ(0, flock(filedesc, LOCK_SH));
67 check_audit(fds, extregex, pipefd);
71 ATF_TC_CLEANUP(flock_success, tc)
77 ATF_TC_WITH_CLEANUP(flock_failure);
78 ATF_TC_HEAD(flock_failure, tc)
80 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
84 ATF_TC_BODY(flock_failure, tc)
86 const char *regex = "flock.*return,failure : Bad file descriptor";
87 FILE *pipefd = setup(fds, auclass);
88 ATF_REQUIRE_EQ(-1, flock(-1, LOCK_SH));
89 check_audit(fds, regex, pipefd);
92 ATF_TC_CLEANUP(flock_failure, tc)
98 ATF_TC_WITH_CLEANUP(fcntl_success);
99 ATF_TC_HEAD(fcntl_success, tc)
101 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
105 ATF_TC_BODY(fcntl_success, tc)
108 /* File needs to exist to call fcntl(2) */
109 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
110 FILE *pipefd = setup(fds, auclass);
112 /* Retrieve the status flags of 'filedesc' and store it in flagstatus */
113 ATF_REQUIRE((flagstatus = fcntl(filedesc, F_GETFL, 0)) != -1);
114 snprintf(extregex, sizeof(extregex),
115 "fcntl.*return,success,%d", flagstatus);
116 check_audit(fds, extregex, pipefd);
120 ATF_TC_CLEANUP(fcntl_success, tc)
126 ATF_TC_WITH_CLEANUP(fcntl_failure);
127 ATF_TC_HEAD(fcntl_failure, tc)
129 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
133 ATF_TC_BODY(fcntl_failure, tc)
135 const char *regex = "fcntl.*return,failure : Bad file descriptor";
136 FILE *pipefd = setup(fds, auclass);
137 ATF_REQUIRE_EQ(-1, fcntl(-1, F_GETFL, 0));
138 check_audit(fds, regex, pipefd);
141 ATF_TC_CLEANUP(fcntl_failure, tc)
147 ATF_TC_WITH_CLEANUP(fsync_success);
148 ATF_TC_HEAD(fsync_success, tc)
150 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
154 ATF_TC_BODY(fsync_success, tc)
157 snprintf(extregex, sizeof(extregex), "fsync.*%d.*return,success", pid);
159 /* File needs to exist to call fsync(2) */
160 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
161 FILE *pipefd = setup(fds, auclass);
162 ATF_REQUIRE_EQ(0, fsync(filedesc));
163 check_audit(fds, extregex, pipefd);
167 ATF_TC_CLEANUP(fsync_success, tc)
173 ATF_TC_WITH_CLEANUP(fsync_failure);
174 ATF_TC_HEAD(fsync_failure, tc)
176 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
180 ATF_TC_BODY(fsync_failure, tc)
182 const char *regex = "fsync.*return,failure : Bad file descriptor";
183 FILE *pipefd = setup(fds, auclass);
184 /* Failure reason: Invalid file descriptor */
185 ATF_REQUIRE_EQ(-1, fsync(-1));
186 check_audit(fds, regex, pipefd);
189 ATF_TC_CLEANUP(fsync_failure, tc)
195 ATF_TC_WITH_CLEANUP(chmod_success);
196 ATF_TC_HEAD(chmod_success, tc)
198 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
202 ATF_TC_BODY(chmod_success, tc)
204 /* File needs to exist to call chmod(2) */
205 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
206 FILE *pipefd = setup(fds, auclass);
207 ATF_REQUIRE_EQ(0, chmod(path, mode));
208 check_audit(fds, successreg, pipefd);
212 ATF_TC_CLEANUP(chmod_success, tc)
218 ATF_TC_WITH_CLEANUP(chmod_failure);
219 ATF_TC_HEAD(chmod_failure, tc)
221 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
225 ATF_TC_BODY(chmod_failure, tc)
227 FILE *pipefd = setup(fds, auclass);
228 /* Failure reason: file does not exist */
229 ATF_REQUIRE_EQ(-1, chmod(errpath, mode));
230 check_audit(fds, failurereg, pipefd);
233 ATF_TC_CLEANUP(chmod_failure, tc)
239 ATF_TC_WITH_CLEANUP(fchmod_success);
240 ATF_TC_HEAD(fchmod_success, tc)
242 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
246 ATF_TC_BODY(fchmod_success, tc)
249 snprintf(extregex, sizeof(extregex), "fchmod.*%d.*return,success", pid);
251 /* File needs to exist to call fchmod(2) */
252 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
253 FILE *pipefd = setup(fds, auclass);
254 ATF_REQUIRE_EQ(0, fchmod(filedesc, mode));
255 check_audit(fds, extregex, pipefd);
259 ATF_TC_CLEANUP(fchmod_success, tc)
265 ATF_TC_WITH_CLEANUP(fchmod_failure);
266 ATF_TC_HEAD(fchmod_failure, tc)
268 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
272 ATF_TC_BODY(fchmod_failure, tc)
274 const char *regex = "fchmod.*return,failure : Bad file descriptor";
275 FILE *pipefd = setup(fds, auclass);
276 /* Failure reason: Invalid file descriptor */
277 ATF_REQUIRE_EQ(-1, fchmod(-1, mode));
278 check_audit(fds, regex, pipefd);
281 ATF_TC_CLEANUP(fchmod_failure, tc)
287 ATF_TC_WITH_CLEANUP(lchmod_success);
288 ATF_TC_HEAD(lchmod_success, tc)
290 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
294 ATF_TC_BODY(lchmod_success, tc)
296 /* Symbolic link needs to exist to call lchmod(2) */
297 ATF_REQUIRE_EQ(0, symlink("symlink", path));
298 FILE *pipefd = setup(fds, auclass);
299 ATF_REQUIRE_EQ(0, lchmod(path, mode));
300 check_audit(fds, successreg, pipefd);
303 ATF_TC_CLEANUP(lchmod_success, tc)
309 ATF_TC_WITH_CLEANUP(lchmod_failure);
310 ATF_TC_HEAD(lchmod_failure, tc)
312 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
316 ATF_TC_BODY(lchmod_failure, tc)
318 FILE *pipefd = setup(fds, auclass);
319 /* Failure reason: file does not exist */
320 ATF_REQUIRE_EQ(-1, lchmod(errpath, mode));
321 check_audit(fds, failurereg, pipefd);
324 ATF_TC_CLEANUP(lchmod_failure, tc)
330 ATF_TC_WITH_CLEANUP(fchmodat_success);
331 ATF_TC_HEAD(fchmodat_success, tc)
333 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
337 ATF_TC_BODY(fchmodat_success, tc)
339 /* File needs to exist to call fchmodat(2) */
340 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
341 FILE *pipefd = setup(fds, auclass);
342 ATF_REQUIRE_EQ(0, fchmodat(AT_FDCWD, path, mode, 0));
343 check_audit(fds, successreg, pipefd);
347 ATF_TC_CLEANUP(fchmodat_success, tc)
353 ATF_TC_WITH_CLEANUP(fchmodat_failure);
354 ATF_TC_HEAD(fchmodat_failure, tc)
356 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
360 ATF_TC_BODY(fchmodat_failure, tc)
362 FILE *pipefd = setup(fds, auclass);
363 /* Failure reason: file does not exist */
364 ATF_REQUIRE_EQ(-1, fchmodat(AT_FDCWD, errpath, mode, 0));
365 check_audit(fds, failurereg, pipefd);
368 ATF_TC_CLEANUP(fchmodat_failure, tc)
374 ATF_TC_WITH_CLEANUP(chown_success);
375 ATF_TC_HEAD(chown_success, tc)
377 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
381 ATF_TC_BODY(chown_success, tc)
383 /* File needs to exist to call chown(2) */
384 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
385 FILE *pipefd = setup(fds, auclass);
386 ATF_REQUIRE_EQ(0, chown(path, uid, gid));
387 check_audit(fds, successreg, pipefd);
391 ATF_TC_CLEANUP(chown_success, tc)
397 ATF_TC_WITH_CLEANUP(chown_failure);
398 ATF_TC_HEAD(chown_failure, tc)
400 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
404 ATF_TC_BODY(chown_failure, tc)
406 FILE *pipefd = setup(fds, auclass);
407 /* Failure reason: file does not exist */
408 ATF_REQUIRE_EQ(-1, chown(errpath, uid, gid));
409 check_audit(fds, failurereg, pipefd);
412 ATF_TC_CLEANUP(chown_failure, tc)
418 ATF_TC_WITH_CLEANUP(fchown_success);
419 ATF_TC_HEAD(fchown_success, tc)
421 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
425 ATF_TC_BODY(fchown_success, tc)
428 snprintf(extregex, sizeof(extregex), "fchown.*%d.*return,success", pid);
430 /* File needs to exist to call fchown(2) */
431 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
432 FILE *pipefd = setup(fds, auclass);
433 ATF_REQUIRE_EQ(0, fchown(filedesc, uid, gid));
434 check_audit(fds, extregex, pipefd);
438 ATF_TC_CLEANUP(fchown_success, tc)
444 ATF_TC_WITH_CLEANUP(fchown_failure);
445 ATF_TC_HEAD(fchown_failure, tc)
447 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
451 ATF_TC_BODY(fchown_failure, tc)
453 const char *regex = "fchown.*return,failure : Bad file descriptor";
454 FILE *pipefd = setup(fds, auclass);
455 /* Failure reason: Invalid file descriptor */
456 ATF_REQUIRE_EQ(-1, fchown(-1, uid, gid));
457 check_audit(fds, regex, pipefd);
460 ATF_TC_CLEANUP(fchown_failure, tc)
466 ATF_TC_WITH_CLEANUP(lchown_success);
467 ATF_TC_HEAD(lchown_success, tc)
469 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
473 ATF_TC_BODY(lchown_success, tc)
475 /* Symbolic link needs to exist to call lchown(2) */
476 ATF_REQUIRE_EQ(0, symlink("symlink", path));
477 FILE *pipefd = setup(fds, auclass);
478 ATF_REQUIRE_EQ(0, lchown(path, uid, gid));
479 check_audit(fds, successreg, pipefd);
482 ATF_TC_CLEANUP(lchown_success, tc)
488 ATF_TC_WITH_CLEANUP(lchown_failure);
489 ATF_TC_HEAD(lchown_failure, tc)
491 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
495 ATF_TC_BODY(lchown_failure, tc)
497 FILE *pipefd = setup(fds, auclass);
498 /* Failure reason: Symbolic link does not exist */
499 ATF_REQUIRE_EQ(-1, lchown(errpath, uid, gid));
500 check_audit(fds, failurereg, pipefd);
503 ATF_TC_CLEANUP(lchown_failure, tc)
509 ATF_TC_WITH_CLEANUP(fchownat_success);
510 ATF_TC_HEAD(fchownat_success, tc)
512 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
516 ATF_TC_BODY(fchownat_success, tc)
518 /* File needs to exist to call fchownat(2) */
519 ATF_REQUIRE((filedesc = open(path, O_CREAT, mode)) != -1);
520 FILE *pipefd = setup(fds, auclass);
521 ATF_REQUIRE_EQ(0, fchownat(AT_FDCWD, path, uid, gid, 0));
522 check_audit(fds, successreg, pipefd);
526 ATF_TC_CLEANUP(fchownat_success, tc)
532 ATF_TC_WITH_CLEANUP(fchownat_failure);
533 ATF_TC_HEAD(fchownat_failure, tc)
535 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
539 ATF_TC_BODY(fchownat_failure, tc)
541 FILE *pipefd = setup(fds, auclass);
542 /* Failure reason: file does not exist */
543 ATF_REQUIRE_EQ(-1, fchownat(AT_FDCWD, errpath, uid, gid, 0));
544 check_audit(fds, failurereg, pipefd);
547 ATF_TC_CLEANUP(fchownat_failure, tc)
555 ATF_TP_ADD_TC(tp, flock_success);
556 ATF_TP_ADD_TC(tp, flock_failure);
557 ATF_TP_ADD_TC(tp, fcntl_success);
558 ATF_TP_ADD_TC(tp, fcntl_failure);
559 ATF_TP_ADD_TC(tp, fsync_success);
560 ATF_TP_ADD_TC(tp, fsync_failure);
562 ATF_TP_ADD_TC(tp, chmod_success);
563 ATF_TP_ADD_TC(tp, chmod_failure);
564 ATF_TP_ADD_TC(tp, fchmod_success);
565 ATF_TP_ADD_TC(tp, fchmod_failure);
566 ATF_TP_ADD_TC(tp, lchmod_success);
567 ATF_TP_ADD_TC(tp, lchmod_failure);
568 ATF_TP_ADD_TC(tp, fchmodat_success);
569 ATF_TP_ADD_TC(tp, fchmodat_failure);
571 ATF_TP_ADD_TC(tp, chown_success);
572 ATF_TP_ADD_TC(tp, chown_failure);
573 ATF_TP_ADD_TC(tp, fchown_success);
574 ATF_TP_ADD_TC(tp, fchown_failure);
575 ATF_TP_ADD_TC(tp, lchown_success);
576 ATF_TP_ADD_TC(tp, lchown_failure);
577 ATF_TP_ADD_TC(tp, fchownat_success);
578 ATF_TP_ADD_TC(tp, fchownat_failure);
580 return (atf_no_error());