forked from luck/tmp_suning_uos_patched
netfilter: nfnetlink_queue: add NFQA_CAP_LEN attribute
This patch adds the NFQA_CAP_LEN attribute that allows us to know what is the real packet size from user-space (even if we decided to retrieve just a few bytes from the packet instead of all of it). Security software that inspects packets should always check for this new attribute to make sure that it is inspecting the entire packet. This also helps to provide a workaround for the problem described in: http://marc.info/?l=netfilter-devel&m=134519473212536&w=2 Original idea from Florian Westphal. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
ba8d3b0bf5
commit
6ee584be3e
@ -44,6 +44,7 @@ enum nfqnl_attr_type {
|
||||
NFQA_PAYLOAD, /* opaque data payload */
|
||||
NFQA_CT, /* nf_conntrack_netlink.h */
|
||||
NFQA_CT_INFO, /* enum ip_conntrack_info */
|
||||
NFQA_CAP_LEN, /* __u32 length of captured packet */
|
||||
|
||||
__NFQA_MAX
|
||||
};
|
||||
|
@ -225,7 +225,7 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
|
||||
{
|
||||
sk_buff_data_t old_tail;
|
||||
size_t size;
|
||||
size_t data_len = 0;
|
||||
size_t data_len = 0, cap_len = 0;
|
||||
struct sk_buff *skb;
|
||||
struct nlattr *nla;
|
||||
struct nfqnl_msg_packet_hdr *pmsg;
|
||||
@ -247,7 +247,8 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
|
||||
#endif
|
||||
+ nla_total_size(sizeof(u_int32_t)) /* mark */
|
||||
+ nla_total_size(sizeof(struct nfqnl_msg_packet_hw))
|
||||
+ nla_total_size(sizeof(struct nfqnl_msg_packet_timestamp));
|
||||
+ nla_total_size(sizeof(struct nfqnl_msg_packet_timestamp)
|
||||
+ nla_total_size(sizeof(u_int32_t))); /* cap_len */
|
||||
|
||||
outdev = entry->outdev;
|
||||
|
||||
@ -266,6 +267,7 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
|
||||
data_len = entskb->len;
|
||||
|
||||
size += nla_total_size(data_len);
|
||||
cap_len = entskb->len;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -402,6 +404,9 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
|
||||
if (ct && nfqnl_ct_put(skb, ct, ctinfo) < 0)
|
||||
goto nla_put_failure;
|
||||
|
||||
if (cap_len > 0 && nla_put_be32(skb, NFQA_CAP_LEN, htonl(cap_len)))
|
||||
goto nla_put_failure;
|
||||
|
||||
nlh->nlmsg_len = skb->tail - old_tail;
|
||||
return skb;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user