Code evolution tracing improves finding vulnerability commits

TraceVIC: Causal Reasoning over Code Evolution for Identifying Vulnerability-Inducing Commits

Software EngineeringArtificial Intelligence

Summary

Software bugs that cause security problems often creep in during code changes but are discovered much later, making it hard to find the exact change that introduced them. The authors propose TraceVIC, a tool that looks at how code changes over time rather than just the earliest or latest related code. TraceVIC builds a detailed map of code evolution and uses this to better identify which change caused the vulnerability. Their method outperforms previous techniques and reliably finds the problematic changes in different C and C++ projects.

What this means in practice

  • For software security teams: Identify the exact code changes causing vulnerabilities to speed up patching and risk assessment in complex software projects.
  • For software maintenance engineers: Trace historical code edits to understand how vulnerabilities develop across multiple revisions and improve code audits.

Authors

Fnu Tanish, Samiha Shimmi, Samikshya Chapagain, Hamed Okhravi, Mona Rahimi, Lei Zhang

Abstract

Software vulnerabilities are often discovered long after they are introduced, making it difficult to identify the vulnerability-inducing commit (VIC) responsible for introducing the underlying vulnerable condition. Existing VIC identification techniques largely rely on git blame to trace vulnerable code through revision history and use positional heuristics, such as selecting its earliest or most recent modification. However, the true VIC may occur anywhere within this history, and vulnerable behavior may depend on code that evolves across multiple revisions. We therefore argue that VIC identification requires reasoning about how vulnerability-relevant code evolves, rather than simply where a candidate commit appears in the revision history. We present TraceVIC, a temporal graph-based approach for identifying and ranking VICs by reasoning over code evolution. TraceVIC first localizes likely root-cause lines and traces their histories across revisions, constructing graph representations that capture program structure within each revision and the evolution of vulnerability-relevant code across the history. It reasons over the resulting revision history, using temporal edges to preserve correspondences between program elements across consecutive revisions, and directly ranks candidate commits according to their contribution to the vulnerable condition. Ablation results show that modeling the full revision history improves F2 from 0.637 to 0.814. TraceVIC improves F2 by up to 28.7% over state-of-the-art methods and identifies a valid VIC for 78 of 79 vulnerabilities across four unseen C/C++ projects.