CVE-2024-56702
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
28/12/2024
Last modified:
28/12/2024
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
bpf: Mark raw_tp arguments with PTR_MAYBE_NULL<br />
<br />
Arguments to a raw tracepoint are tagged as trusted, which carries the<br />
semantics that the pointer will be non-NULL. However, in certain cases,<br />
a raw tracepoint argument may end up being NULL. More context about this<br />
issue is available in [0].<br />
<br />
Thus, there is a discrepancy between the reality, that raw_tp arguments<br />
can actually be NULL, and the verifier&#39;s knowledge, that they are never<br />
NULL, causing explicit NULL checks to be deleted, and accesses to such<br />
pointers potentially crashing the kernel.<br />
<br />
To fix this, mark raw_tp arguments as PTR_MAYBE_NULL, and then special<br />
case the dereference and pointer arithmetic to permit it, and allow<br />
passing them into helpers/kfuncs; these exceptions are made for raw_tp<br />
programs only. Ensure that we don&#39;t do this when ref_obj_id > 0, as in<br />
that case this is an acquired object and doesn&#39;t need such adjustment.<br />
<br />
The reason we do mask_raw_tp_trusted_reg logic is because other will<br />
recheck in places whether the register is a trusted_reg, and then<br />
consider our register as untrusted when detecting the presence of the<br />
PTR_MAYBE_NULL flag.<br />
<br />
To allow safe dereference, we enable PROBE_MEM marking when we see loads<br />
into trusted pointers with PTR_MAYBE_NULL.<br />
<br />
While trusted raw_tp arguments can also be passed into helpers or kfuncs<br />
where such broken assumption may cause issues, a future patch set will<br />
tackle their case separately, as PTR_TO_BTF_ID (without PTR_TRUSTED) can<br />
already be passed into helpers and causes similar problems. Thus, they<br />
are left alone for now.<br />
<br />
It is possible that these checks also permit passing non-raw_tp args<br />
that are trusted PTR_TO_BTF_ID with null marking. In such a case,<br />
allowing dereference when pointer is NULL expands allowed behavior, so<br />
won&#39;t regress existing programs, and the case of passing these into<br />
helpers is the same as above and will be dealt with later.<br />
<br />
Also update the failure case in tp_btf_nullable selftest to capture the<br />
new behavior, as the verifier will no longer cause an error when<br />
directly dereference a raw tracepoint argument marked as __nullable.<br />
<br />
[0]: https://lore.kernel.org/bpf/ZrCZS6nisraEqehw@jlelli-thinkpadt14gen4.remote.csb