diff --git a/src/wardline/scanner/rules/untrusted_to_deserialization.py b/src/wardline/scanner/rules/untrusted_to_deserialization.py index 63cc4e5b..6471e7cc 100644 --- a/src/wardline/scanner/rules/untrusted_to_deserialization.py +++ b/src/wardline/scanner/rules/untrusted_to_deserialization.py @@ -128,7 +128,7 @@ def _has_literal_true_kw(call: ast.Call, name: str) -> bool: " obj = pickle.loads(blob)\n return blob", # numpy.load without allow_pickle=True is safe by default (no object unpickling). "@external_boundary\ndef read_raw(p):\n return p\n" - "@trusted(level='ASSURED')\ndef f(p):\n return numpy.load(read_raw(p))", + "@trusted(level='ASSURED')\ndef f(p):\n numpy.load(read_raw(p))\n return True", ), ) diff --git a/src/wardline/scanner/taint/variable_level.py b/src/wardline/scanner/taint/variable_level.py index a51a6989..1a5f39ea 100644 --- a/src/wardline/scanner/taint/variable_level.py +++ b/src/wardline/scanner/taint/variable_level.py @@ -67,6 +67,14 @@ "tomllib.load", "tomli_w.dumps", "tomli_w.dump", + "shelve.open", + "dill.load", + "dill.loads", + "jsonpickle.decode", + "joblib.load", + "torch.load", + "numpy.load", + "pickle.Unpickler.load", } ) diff --git a/tests/golden/identity/corpus/META.json b/tests/golden/identity/corpus/META.json index 5378e6b9..31867994 100644 --- a/tests/golden/identity/corpus/META.json +++ b/tests/golden/identity/corpus/META.json @@ -1,5 +1,5 @@ { "corpus_version": 6, "fingerprint_scheme": "wlfp2", - "reason": "call-site full-span discriminator" + "reason": "Added missing deserialization sinks to core taint mapping" }