KILLCHAIN: Following Trust Through the Software Supply Chain
This is a submission for the MLH x DEV Writing Challenge . A Hacktoberfest 2026 adventure: Creating KILLCHAIN. We use packages every day. A quick npm command. An import statement. We are using someone's code. The code that lives in a developer's GitHub repository and the package you download from npm are not always the same. Builds can change files. Sometimes unintended changes end up in the…
In today's digital age, we rely heavily on software packages created by others. Each time we install a package using npm or import code from a GitHub repository, we are essentially trusting that the published version matches the original source. However, this trust can be easily broken by supply chain attacks, where malicious changes are introduced to the published package without our knowledge.
At the Hacktoberfest Hack Day in Sonipat, a team created KILLCHAIN, a tool designed to check whether the published package matches the source code. KILLCHAIN is a simple yet powerful solution that addresses the trust gap in software supply chains. By scanning a package name and version, KILLCHAIN downloads the published tarball, retrieves the corresponding source code from GitHub, and compares the two to identify any discrepancies.
The tool goes beyond a mere folder comparison, as differences between the source and package are not always problematic. Builds can legitimately add bundles, metadata, and transformed files. The challenge lies in determining which of these differences warrant attention. KILLCHAIN provides a comprehensive scan report, including package retrieval, extraction, source retrieval, manifest and diff analysis, build-artifact classification, security analysis, provenance checks, risk scoring, AI explanations, and scan history tracking.
The core idea behind KILLCHAIN is that every dependency represents an act of trust. By using packages created by unknown developers and rarely questioning the publishing process, we unknowingly expose ourselves to supply chain attacks. These attacks can occur when someone makes a typo in the package name, uses a company's package name on the registry, or quietly adds malicious code just before publication.
KILLCHAIN operates by scanning the npm registry, checking the package's shasum against the registry's record, carefully extracting the package, and finding the matching source code on GitHub. It hashes every file on both sides and compares the lists, identifying which changes are part of the build process. The tool then applies security rules to determine whether the package is safe, warrants a warning, or is critical, providing a clear risk score and explanation.
The development of KILLCHAIN took place during a hackathon, with the scanning engine, frontend, and deployment and CI processes split among different team members. The project utilized React 19 with TypeScript and Vite for the frontend, Python with FastAPI and Uvicorn for the backend, and a SQLite database to store scan history. The code was written in Python using FastAPI and Vite, with unit tests ensuring the accuracy of the extraction and manifest code.
During the hackathon, the team faced several challenges, including merge conflicts in the run.sh script, accidental inclusion of pycache files, and the need for path safety in archive handling. They overcame these obstacles through continuous integration and testing, ensuring that their solution was robust and reliable.
Looking ahead, KILLCHAIN plans to expand its support to include PyPI and introduce release monitoring to recheck packages when new versions are released. While KILLCHAIN works with npm today, its potential to enhance software security on a larger scale is undeniable.
In conclusion, KILLCHAIN is a valuable tool that helps us bridge the trust gap in software supply chains. By verifying whether a published package matches its source code, we can better protect ourselves against supply chain attacks and ensure the integrity of the software we rely on every day. As developers, it is crucial to remember that every dependency represents an act of trust, and it is our responsibility to verify the authenticity of the code we use.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.