mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-16 19:13:39 -04:00
Merge tag 'audit-pr-20260203' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit
Pull audit updates from Paul Moore: - Improve the NETFILTER_PKT audit records Add source and destination ports to the NETFILTER_PKT audit records while also consolidating a lot of the code into a new, singular audit_log_nf_skb() function. This new approach to structuring the NETFILTER_PKT record generation should eliminate some unnecessary overhead when audit is not built into the kernel. - Update the audit syscall classifier code Add the listxattrat(), getxattrat(), and fchmodat2() syscall to the audit code which classifies syscalls into categories of operations, e.g. "read" or "change attributes". - Move the syscall classifier declarations into audit_arch.h Shuffle around some header file declarations to resolve some sparse warnings. * tag 'audit-pr-20260203' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/audit: audit: move the compat_xxx_class[] extern declarations to audit_arch.h audit: add missing syscalls to read class audit: include source and destination ports to NETFILTER_PKT audit: add audit_log_nf_skb helper function audit: add fchmodat2() to change attributes class
This commit is contained in:
159
kernel/audit.c
159
kernel/audit.c
@@ -58,6 +58,9 @@
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/pid_namespace.h>
|
||||
#include <net/netns/generic.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <linux/sctp.h>
|
||||
|
||||
#include "audit.h"
|
||||
|
||||
@@ -2488,6 +2491,162 @@ void audit_log_path_denied(int type, const char *operation)
|
||||
audit_log_end(ab);
|
||||
}
|
||||
|
||||
int audit_log_nf_skb(struct audit_buffer *ab,
|
||||
const struct sk_buff *skb, u8 nfproto)
|
||||
{
|
||||
/* find the IP protocol in the case of NFPROTO_BRIDGE */
|
||||
if (nfproto == NFPROTO_BRIDGE) {
|
||||
switch (eth_hdr(skb)->h_proto) {
|
||||
case htons(ETH_P_IP):
|
||||
nfproto = NFPROTO_IPV4;
|
||||
break;
|
||||
case htons(ETH_P_IPV6):
|
||||
nfproto = NFPROTO_IPV6;
|
||||
break;
|
||||
default:
|
||||
goto unknown_proto;
|
||||
}
|
||||
}
|
||||
|
||||
switch (nfproto) {
|
||||
case NFPROTO_IPV4: {
|
||||
struct iphdr iph;
|
||||
const struct iphdr *ih;
|
||||
|
||||
ih = skb_header_pointer(skb, skb_network_offset(skb),
|
||||
sizeof(iph), &iph);
|
||||
if (!ih)
|
||||
return -ENOMEM;
|
||||
|
||||
switch (ih->protocol) {
|
||||
case IPPROTO_TCP: {
|
||||
struct tcphdr _tcph;
|
||||
const struct tcphdr *th;
|
||||
|
||||
th = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_tcph), &_tcph);
|
||||
if (!th)
|
||||
return -ENOMEM;
|
||||
|
||||
audit_log_format(ab, " saddr=%pI4 daddr=%pI4 proto=%hhu sport=%hu dport=%hu",
|
||||
&ih->saddr, &ih->daddr, ih->protocol,
|
||||
ntohs(th->source), ntohs(th->dest));
|
||||
break;
|
||||
}
|
||||
case IPPROTO_UDP:
|
||||
case IPPROTO_UDPLITE: {
|
||||
struct udphdr _udph;
|
||||
const struct udphdr *uh;
|
||||
|
||||
uh = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_udph), &_udph);
|
||||
if (!uh)
|
||||
return -ENOMEM;
|
||||
|
||||
audit_log_format(ab, " saddr=%pI4 daddr=%pI4 proto=%hhu sport=%hu dport=%hu",
|
||||
&ih->saddr, &ih->daddr, ih->protocol,
|
||||
ntohs(uh->source), ntohs(uh->dest));
|
||||
break;
|
||||
}
|
||||
case IPPROTO_SCTP: {
|
||||
struct sctphdr _sctph;
|
||||
const struct sctphdr *sh;
|
||||
|
||||
sh = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_sctph), &_sctph);
|
||||
if (!sh)
|
||||
return -ENOMEM;
|
||||
|
||||
audit_log_format(ab, " saddr=%pI4 daddr=%pI4 proto=%hhu sport=%hu dport=%hu",
|
||||
&ih->saddr, &ih->daddr, ih->protocol,
|
||||
ntohs(sh->source), ntohs(sh->dest));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
audit_log_format(ab, " saddr=%pI4 daddr=%pI4 proto=%hhu",
|
||||
&ih->saddr, &ih->daddr, ih->protocol);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case NFPROTO_IPV6: {
|
||||
struct ipv6hdr iph;
|
||||
const struct ipv6hdr *ih;
|
||||
u8 nexthdr;
|
||||
__be16 frag_off;
|
||||
|
||||
ih = skb_header_pointer(skb, skb_network_offset(skb),
|
||||
sizeof(iph), &iph);
|
||||
if (!ih)
|
||||
return -ENOMEM;
|
||||
|
||||
nexthdr = ih->nexthdr;
|
||||
ipv6_skip_exthdr(skb, skb_network_offset(skb) + sizeof(iph),
|
||||
&nexthdr, &frag_off);
|
||||
|
||||
switch (nexthdr) {
|
||||
case IPPROTO_TCP: {
|
||||
struct tcphdr _tcph;
|
||||
const struct tcphdr *th;
|
||||
|
||||
th = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_tcph), &_tcph);
|
||||
if (!th)
|
||||
return -ENOMEM;
|
||||
|
||||
audit_log_format(ab, " saddr=%pI6c daddr=%pI6c proto=%hhu sport=%hu dport=%hu",
|
||||
&ih->saddr, &ih->daddr, nexthdr,
|
||||
ntohs(th->source), ntohs(th->dest));
|
||||
break;
|
||||
}
|
||||
case IPPROTO_UDP:
|
||||
case IPPROTO_UDPLITE: {
|
||||
struct udphdr _udph;
|
||||
const struct udphdr *uh;
|
||||
|
||||
uh = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_udph), &_udph);
|
||||
if (!uh)
|
||||
return -ENOMEM;
|
||||
|
||||
audit_log_format(ab, " saddr=%pI6c daddr=%pI6c proto=%hhu sport=%hu dport=%hu",
|
||||
&ih->saddr, &ih->daddr, nexthdr,
|
||||
ntohs(uh->source), ntohs(uh->dest));
|
||||
break;
|
||||
}
|
||||
case IPPROTO_SCTP: {
|
||||
struct sctphdr _sctph;
|
||||
const struct sctphdr *sh;
|
||||
|
||||
sh = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_sctph), &_sctph);
|
||||
if (!sh)
|
||||
return -ENOMEM;
|
||||
|
||||
audit_log_format(ab, " saddr=%pI6c daddr=%pI6c proto=%hhu sport=%hu dport=%hu",
|
||||
&ih->saddr, &ih->daddr, nexthdr,
|
||||
ntohs(sh->source), ntohs(sh->dest));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
audit_log_format(ab, " saddr=%pI6c daddr=%pI6c proto=%hhu",
|
||||
&ih->saddr, &ih->daddr, nexthdr);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
goto unknown_proto;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
unknown_proto:
|
||||
audit_log_format(ab, " saddr=? daddr=? proto=?");
|
||||
return -EPFNOSUPPORT;
|
||||
}
|
||||
EXPORT_SYMBOL(audit_log_nf_skb);
|
||||
|
||||
/* global counter which is incremented every time something logs in */
|
||||
static atomic_t session_id = ATOMIC_INIT(0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user