diff options
author | Eric Paris <eparis@redhat.com> | 2008-04-18 10:12:59 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2008-04-28 06:19:22 -0400 |
commit | b556f8ad58c6e9f8f485c8cef7546e3fc82c382a (patch) | |
tree | e7a1c5ce313b6dec9727d69b08b5005dc35709a3 | |
parent | f09ac9db2aafe36fde9ebd63c8c5d776f6e7bd41 (diff) |
Audit: standardize string audit interfaces
This patch standardized the string auditing interfaces. No userspace
changes will be visible and this is all just cleanup and consistancy
work. We have the following string audit interfaces to use:
void audit_log_n_hex(struct audit_buffer *ab, const unsigned char *buf, size_t len);
void audit_log_n_string(struct audit_buffer *ab, const char *buf, size_t n);
void audit_log_string(struct audit_buffer *ab, const char *buf);
void audit_log_n_untrustedstring(struct audit_buffer *ab, const char *string, size_t n);
void audit_log_untrustedstring(struct audit_buffer *ab, const char *string);
This may be the first step to possibly fixing some of the issues that
people have with the string output from the kernel audit system. But we
still don't have an agreed upon solution to that problem.
Signed-off-by: Eric Paris <eparis@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | drivers/char/tty_audit.c | 2 | ||||
-rw-r--r-- | include/linux/audit.h | 22 | ||||
-rw-r--r-- | kernel/audit.c | 19 | ||||
-rw-r--r-- | kernel/auditsc.c | 8 | ||||
-rw-r--r-- | security/selinux/avc.c | 2 |
5 files changed, 29 insertions, 24 deletions
diff --git a/drivers/char/tty_audit.c b/drivers/char/tty_audit.c index 9739bbfc8f70..caeedd12d494 100644 --- a/drivers/char/tty_audit.c +++ b/drivers/char/tty_audit.c | |||
@@ -92,7 +92,7 @@ static void tty_audit_buf_push(struct task_struct *tsk, uid_t loginuid, | |||
92 | get_task_comm(name, tsk); | 92 | get_task_comm(name, tsk); |
93 | audit_log_untrustedstring(ab, name); | 93 | audit_log_untrustedstring(ab, name); |
94 | audit_log_format(ab, " data="); | 94 | audit_log_format(ab, " data="); |
95 | audit_log_n_untrustedstring(ab, buf->valid, buf->data); | 95 | audit_log_n_untrustedstring(ab, buf->data, buf->valid); |
96 | audit_log_end(ab); | 96 | audit_log_end(ab); |
97 | } | 97 | } |
98 | buf->valid = 0; | 98 | buf->valid = 0; |
diff --git a/include/linux/audit.h b/include/linux/audit.h index 25f6ae30dd4b..f938335af75e 100644 --- a/include/linux/audit.h +++ b/include/linux/audit.h | |||
@@ -549,16 +549,20 @@ extern void audit_log_format(struct audit_buffer *ab, | |||
549 | const char *fmt, ...) | 549 | const char *fmt, ...) |
550 | __attribute__((format(printf,2,3))); | 550 | __attribute__((format(printf,2,3))); |
551 | extern void audit_log_end(struct audit_buffer *ab); | 551 | extern void audit_log_end(struct audit_buffer *ab); |
552 | extern void audit_log_hex(struct audit_buffer *ab, | ||
553 | const unsigned char *buf, | ||
554 | size_t len); | ||
555 | extern int audit_string_contains_control(const char *string, | 552 | extern int audit_string_contains_control(const char *string, |
556 | size_t len); | 553 | size_t len); |
554 | extern void audit_log_n_hex(struct audit_buffer *ab, | ||
555 | const unsigned char *buf, | ||
556 | size_t len); | ||
557 | extern void audit_log_n_string(struct audit_buffer *ab, | ||
558 | const char *buf, | ||
559 | size_t n); | ||
560 | #define audit_log_string(a,b) audit_log_n_string(a, b, strlen(b)); | ||
561 | extern void audit_log_n_untrustedstring(struct audit_buffer *ab, | ||
562 | const char *string, | ||
563 | size_t n); | ||
557 | extern void audit_log_untrustedstring(struct audit_buffer *ab, | 564 | extern void audit_log_untrustedstring(struct audit_buffer *ab, |
558 | const char *string); | 565 | const char *string); |
559 | extern void audit_log_n_untrustedstring(struct audit_buffer *ab, | ||
560 | size_t n, | ||
561 | const char *string); | ||
562 | extern void audit_log_d_path(struct audit_buffer *ab, | 566 | extern void audit_log_d_path(struct audit_buffer *ab, |
563 | const char *prefix, | 567 | const char *prefix, |
564 | struct path *path); | 568 | struct path *path); |
@@ -578,9 +582,11 @@ extern int audit_enabled; | |||
578 | #define audit_log_vformat(b,f,a) do { ; } while (0) | 582 | #define audit_log_vformat(b,f,a) do { ; } while (0) |
579 | #define audit_log_format(b,f,...) do { ; } while (0) | 583 | #define audit_log_format(b,f,...) do { ; } while (0) |
580 | #define audit_log_end(b) do { ; } while (0) | 584 | #define audit_log_end(b) do { ; } while (0) |
581 | #define audit_log_hex(a,b,l) do { ; } while (0) | 585 | #define audit_log_n_hex(a,b,l) do { ; } while (0) |
582 | #define audit_log_untrustedstring(a,s) do { ; } while (0) | 586 | #define audit_log_n_string(a,c,l) do { ; } while (0) |
587 | #define audit_log_string(a,c) do { ; } while (0) | ||
583 | #define audit_log_n_untrustedstring(a,n,s) do { ; } while (0) | 588 | #define audit_log_n_untrustedstring(a,n,s) do { ; } while (0) |
589 | #define audit_log_untrustedstring(a,s) do { ; } while (0) | ||
584 | #define audit_log_d_path(b, p, d) do { ; } while (0) | 590 | #define audit_log_d_path(b, p, d) do { ; } while (0) |
585 | #define audit_enabled 0 | 591 | #define audit_enabled 0 |
586 | #endif | 592 | #endif |
diff --git a/kernel/audit.c b/kernel/audit.c index 520583d8ca18..5b9ad3dda885 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -757,8 +757,7 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
757 | 757 | ||
758 | audit_log_format(ab, " msg="); | 758 | audit_log_format(ab, " msg="); |
759 | size = nlmsg_len(nlh); | 759 | size = nlmsg_len(nlh); |
760 | audit_log_n_untrustedstring(ab, size, | 760 | audit_log_n_untrustedstring(ab, data, size); |
761 | data); | ||
762 | } | 761 | } |
763 | audit_set_pid(ab, pid); | 762 | audit_set_pid(ab, pid); |
764 | audit_log_end(ab); | 763 | audit_log_end(ab); |
@@ -1293,7 +1292,7 @@ void audit_log_format(struct audit_buffer *ab, const char *fmt, ...) | |||
1293 | * This function will take the passed buf and convert it into a string of | 1292 | * This function will take the passed buf and convert it into a string of |
1294 | * ascii hex digits. The new string is placed onto the skb. | 1293 | * ascii hex digits. The new string is placed onto the skb. |
1295 | */ | 1294 | */ |
1296 | void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf, | 1295 | void audit_log_n_hex(struct audit_buffer *ab, const unsigned char *buf, |
1297 | size_t len) | 1296 | size_t len) |
1298 | { | 1297 | { |
1299 | int i, avail, new_len; | 1298 | int i, avail, new_len; |
@@ -1329,8 +1328,8 @@ void audit_log_hex(struct audit_buffer *ab, const unsigned char *buf, | |||
1329 | * Format a string of no more than slen characters into the audit buffer, | 1328 | * Format a string of no more than slen characters into the audit buffer, |
1330 | * enclosed in quote marks. | 1329 | * enclosed in quote marks. |
1331 | */ | 1330 | */ |
1332 | static void audit_log_n_string(struct audit_buffer *ab, size_t slen, | 1331 | void audit_log_n_string(struct audit_buffer *ab, const char *string, |
1333 | const char *string) | 1332 | size_t slen) |
1334 | { | 1333 | { |
1335 | int avail, new_len; | 1334 | int avail, new_len; |
1336 | unsigned char *ptr; | 1335 | unsigned char *ptr; |
@@ -1386,13 +1385,13 @@ int audit_string_contains_control(const char *string, size_t len) | |||
1386 | * The caller specifies the number of characters in the string to log, which may | 1385 | * The caller specifies the number of characters in the string to log, which may |
1387 | * or may not be the entire string. | 1386 | * or may not be the entire string. |
1388 | */ | 1387 | */ |
1389 | void audit_log_n_untrustedstring(struct audit_buffer *ab, size_t len, | 1388 | void audit_log_n_untrustedstring(struct audit_buffer *ab, const char *string, |
1390 | const char *string) | 1389 | size_t len) |
1391 | { | 1390 | { |
1392 | if (audit_string_contains_control(string, len)) | 1391 | if (audit_string_contains_control(string, len)) |
1393 | audit_log_hex(ab, string, len); | 1392 | audit_log_n_hex(ab, string, len); |
1394 | else | 1393 | else |
1395 | audit_log_n_string(ab, len, string); | 1394 | audit_log_n_string(ab, string, len); |
1396 | } | 1395 | } |
1397 | 1396 | ||
1398 | /** | 1397 | /** |
@@ -1405,7 +1404,7 @@ void audit_log_n_untrustedstring(struct audit_buffer *ab, size_t len, | |||
1405 | */ | 1404 | */ |
1406 | void audit_log_untrustedstring(struct audit_buffer *ab, const char *string) | 1405 | void audit_log_untrustedstring(struct audit_buffer *ab, const char *string) |
1407 | { | 1406 | { |
1408 | audit_log_n_untrustedstring(ab, strlen(string), string); | 1407 | audit_log_n_untrustedstring(ab, string, strlen(string)); |
1409 | } | 1408 | } |
1410 | 1409 | ||
1411 | /* This is a helper-function to print the escaped d_path */ | 1410 | /* This is a helper-function to print the escaped d_path */ |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index d7249fcdc442..0072b1d8b258 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -1095,7 +1095,7 @@ static int audit_log_single_execve_arg(struct audit_context *context, | |||
1095 | audit_log_format(*ab, "[%d]", i); | 1095 | audit_log_format(*ab, "[%d]", i); |
1096 | audit_log_format(*ab, "="); | 1096 | audit_log_format(*ab, "="); |
1097 | if (has_cntl) | 1097 | if (has_cntl) |
1098 | audit_log_hex(*ab, buf, to_send); | 1098 | audit_log_n_hex(*ab, buf, to_send); |
1099 | else | 1099 | else |
1100 | audit_log_format(*ab, "\"%s\"", buf); | 1100 | audit_log_format(*ab, "\"%s\"", buf); |
1101 | audit_log_format(*ab, "\n"); | 1101 | audit_log_format(*ab, "\n"); |
@@ -1307,7 +1307,7 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
1307 | struct audit_aux_data_sockaddr *axs = (void *)aux; | 1307 | struct audit_aux_data_sockaddr *axs = (void *)aux; |
1308 | 1308 | ||
1309 | audit_log_format(ab, "saddr="); | 1309 | audit_log_format(ab, "saddr="); |
1310 | audit_log_hex(ab, axs->a, axs->len); | 1310 | audit_log_n_hex(ab, axs->a, axs->len); |
1311 | break; } | 1311 | break; } |
1312 | 1312 | ||
1313 | case AUDIT_FD_PAIR: { | 1313 | case AUDIT_FD_PAIR: { |
@@ -1371,8 +1371,8 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts | |||
1371 | default: | 1371 | default: |
1372 | /* log the name's directory component */ | 1372 | /* log the name's directory component */ |
1373 | audit_log_format(ab, " name="); | 1373 | audit_log_format(ab, " name="); |
1374 | audit_log_n_untrustedstring(ab, n->name_len, | 1374 | audit_log_n_untrustedstring(ab, n->name, |
1375 | n->name); | 1375 | n->name_len); |
1376 | } | 1376 | } |
1377 | } else | 1377 | } else |
1378 | audit_log_format(ab, " name=(null)"); | 1378 | audit_log_format(ab, " name=(null)"); |
diff --git a/security/selinux/avc.c b/security/selinux/avc.c index 95a8ef4a5073..114b4b4c97b2 100644 --- a/security/selinux/avc.c +++ b/security/selinux/avc.c | |||
@@ -646,7 +646,7 @@ void avc_audit(u32 ssid, u32 tsid, | |||
646 | if (*p) | 646 | if (*p) |
647 | audit_log_untrustedstring(ab, p); | 647 | audit_log_untrustedstring(ab, p); |
648 | else | 648 | else |
649 | audit_log_hex(ab, p, len); | 649 | audit_log_n_hex(ab, p, len); |
650 | break; | 650 | break; |
651 | } | 651 | } |
652 | } | 652 | } |