You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
summaries: a sink in unreachable code of a project function is reported at its callers #258
app.py:10: high command-injection: Command injection: stdin input reaches python.os.system through run_it
The same os.system(input()) written directly under if False: in caller is refuted: within a function, RefutationAnalysis drops flows whose sink block constant propagation proves unreachable. The summary of run_it records the external call whatever the reachability of its block, so the caller gets a vulnerability for code that cannot run.
The summaries already know reachability for one case: since the review of #240 part 2 (PR #257), the record of an invocation of a call's result (ExternalCall.invoked_at) is kept only when the call and the invocation can run. That fix was kept to the new records on purpose, because extending it changes existing verdicts.
Expected
An external call in a block that constant propagation proves unreachable is not recorded in its function's summary, so no caller reports a flow through it. Reachable calls are recorded as today.
Open points:
Whether the dependencies computed in unreachable blocks (returns, stores, mutations) should be dropped too. Dropping them keeps a summary consistent with what can run, but changes more than sink reporting.
ConstantPropagation is intraprocedural: a branch decided by a caller's constant argument is not seen, as within a function today.
Acceptance criteria
The reproduction above reports nothing, through one and two levels of project functions; the same sink in reachable code is still reported.
Regression baselines (tests/regression/expected/) are re-measured on the same commit and configuration, and every change is explained.
Activity
test(cache): pin that a new engine version reuses nothing cached
fix(summaries): keep a nonlocal's value where a nested function may l…