<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: nullvoid</title>
    <description>The latest articles on DEV Community by nullvoid (@null_void_).</description>
    <link>https://dev.to/null_void_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1563271%2F1fdc0897-c100-4587-b39e-81726bb0640a.png</url>
      <title>DEV Community: nullvoid</title>
      <link>https://dev.to/null_void_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/null_void_"/>
    <language>en</language>
    <item>
      <title>How NullVoid uses GitHub</title>
      <dc:creator>nullvoid</dc:creator>
      <pubDate>Sat, 14 Nov 2026 15:30:26 +0000</pubDate>
      <link>https://dev.to/null_void_/how-nullvoid-uses-github-2lp5</link>
      <guid>https://dev.to/null_void_/how-nullvoid-uses-github-2lp5</guid>
      <description>&lt;p&gt;NullVoid is a static scanner for malicious code in npm packages and Node.js projects. GitHub data feeds it in three places: live vulnerability lookups during a scan, community signals about a package's source repository, and the training labels for its machine-learning models.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Live advisory lookups (GitHub Security Advisories)
&lt;/h2&gt;

&lt;p&gt;For every declared dependency, NullVoid queries the &lt;a href="https://github.com/advisories" rel="noopener noreferrer"&gt;GitHub Advisory Database&lt;/a&gt; through the GraphQL API (&lt;code&gt;https://api.github.com/graphql&lt;/code&gt;). It asks for npm-ecosystem advisories affecting the package, then checks the installed version against each advisory's &lt;code&gt;vulnerableVersionRange&lt;/code&gt; so only advisories that actually apply are reported.&lt;/p&gt;

&lt;p&gt;Each matching advisory becomes a finding carrying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the GHSA ID and permalink, plus any CVE identifiers&lt;/li&gt;
&lt;li&gt;GitHub's severity (CRITICAL / HIGH / MODERATE / LOW) and CVSS score&lt;/li&gt;
&lt;li&gt;CWE classifications&lt;/li&gt;
&lt;li&gt;the first patched version, so the report can say what to upgrade to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GHSA is one of several IoC providers, alongside npm advisories, NVD and optionally Snyk. Results are cached and combined with the other sources. It is enabled by default; set &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; (or &lt;code&gt;NULLVOID_GITHUB_TOKEN&lt;/code&gt;) for higher rate limits. See &lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/docs/IOC_USAGE.md" rel="noopener noreferrer"&gt;IOC_USAGE.md&lt;/a&gt; for configuration.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/ts/src/lib/providers/ghsa.ts" rel="noopener noreferrer"&gt;&lt;code&gt;ts/src/lib/providers/ghsa.ts&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Community signals from the source repository
&lt;/h2&gt;

&lt;p&gt;When a package's &lt;code&gt;repository&lt;/code&gt; field points at GitHub, NullVoid reads the repository's public metadata from the REST API (&lt;code&gt;GET /repos/{owner}/{repo}&lt;/code&gt;) and uses its star count as one input (30% weight, alongside npm downloads and dependents) to a popularity score. That score feeds the dependency-confusion and ML detectors, so a brand-new package with no real repository behind it is treated differently from an established, widely starred project.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/ts/src/lib/communityAnalysis.ts" rel="noopener noreferrer"&gt;&lt;code&gt;ts/src/lib/communityAnalysis.ts&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Training data for the ML models
&lt;/h2&gt;

&lt;p&gt;NullVoid's dependency and behavioral models are retrained on a schedule by a GitHub Actions workflow (&lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/.github/workflows/ml-model-retrain.yml" rel="noopener noreferrer"&gt;&lt;code&gt;ml-model-retrain.yml&lt;/code&gt;&lt;/a&gt;). The export scripts page through the REST advisories endpoint (&lt;code&gt;GET /advisories?ecosystem=npm&amp;amp;type=malware&lt;/code&gt;, plus &lt;code&gt;type=reviewed&lt;/code&gt;), skip withdrawn advisories, and collect the affected npm packages as labelled examples. GitHub's curated malware advisories are what let the models learn what real npm supply-chain attacks look like, rather than relying on synthetic samples.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/ml-model/export-features.js" rel="noopener noreferrer"&gt;&lt;code&gt;ml-model/export-features.js&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/ml-model/export-behavioral-features.js" rel="noopener noreferrer"&gt;&lt;code&gt;ml-model/export-behavioral-features.js&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Running NullVoid on GitHub
&lt;/h2&gt;

&lt;p&gt;NullVoid also runs inside GitHub: it can emit SARIF, which GitHub code scanning picks up through &lt;code&gt;github/codeql-action/upload-sarif&lt;/code&gt;, so findings show up in a repository's Security tab and on pull requests. The workflow is in the &lt;a href="https://github.com/kurt-grung/NullVoid#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt; and &lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/docs/CI_INTEGRATION.md" rel="noopener noreferrer"&gt;CI_INTEGRATION.md&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support
&lt;/h2&gt;

&lt;p&gt;Questions or problems: &lt;a href="https://github.com/kurt-grung/NullVoid/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; or email &lt;a href="mailto:caterer.01boars@icloud.com"&gt;caterer.01boars@icloud.com&lt;/a&gt;. &lt;br&gt;
Report vulnerabilities as described in &lt;a href="https://github.com/kurt-grung/NullVoid/blob/main/SECURITY.md" rel="noopener noreferrer"&gt;SECURITY.md&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;canonical_url: &lt;a href="https://kurtgrung.com/blog/how-nullvoid-uses-github/" rel="noopener noreferrer"&gt;https://kurtgrung.com/blog/how-nullvoid-uses-github/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
