muaddib-scanner 2.10.13 → 2.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/iocs/builtin.yaml CHANGED
@@ -206,6 +206,8 @@ files:
206
206
  # GlassWorm (mars 2026)
207
207
  - i.js
208
208
  - init.json
209
+ # LiteLLM/Checkmarx (mars 2026) — .pth = Python auto-exec persistence
210
+ - litellm_init.pth
209
211
 
210
212
  hashes:
211
213
  # Shai-Hulud v2 payloads
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muaddib-scanner",
3
- "version": "2.10.13",
3
+ "version": "2.10.14",
4
4
  "description": "Supply-chain threat detection & response for npm & PyPI/Python",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -690,6 +690,14 @@ const PLAYBOOKS = {
690
690
  'pour reecrire le malware a chaque execution, evitant la detection par signature. Moteur polymorphe. ' +
691
691
  'Verifier si Ollama est installe: curl http://localhost:11434/api/tags. ' +
692
692
  'Aucun package npm legitime n\'appelle un LLM local. Supprimer le package.',
693
+
694
+ pth_persistence:
695
+ 'CRITIQUE: Ecriture d\'un fichier .pth detectee. Les fichiers .pth dans site-packages/ sont executes ' +
696
+ 'automatiquement par Python au demarrage — c\'est un vecteur de persistence invisible. ' +
697
+ 'Technique LiteLLM/Checkmarx (mars 2026): litellm_init.pth contient du code base64 qui installe un stealer ' +
698
+ 'dans ~/.config/sysmon/ et exfiltre vers checkmarx.zone. ' +
699
+ 'Verifier: find $(python -c "import site; print(site.getsitepackages()[0])") -name "*.pth" -exec cat {} \\; ' +
700
+ 'Supprimer tout fichier .pth non standard. Rotation des credentials.',
693
701
  };
694
702
 
695
703
  function getPlaybook(threatType) {
@@ -1667,6 +1667,18 @@ const RULES = {
1667
1667
  ],
1668
1668
  mitre: 'T1543.002'
1669
1669
  },
1670
+ pth_persistence: {
1671
+ id: 'MUADDIB-AST-061',
1672
+ name: 'Python .pth Auto-Exec Persistence',
1673
+ severity: 'CRITICAL',
1674
+ confidence: 'high',
1675
+ description: 'Ecriture d\'un fichier .pth detectee. Les fichiers .pth dans site-packages/ sont executes automatiquement par l\'interpreteur Python au demarrage, sans import explicite. Technique de persistence LiteLLM/Checkmarx (litellm_init.pth) : le .pth contient du code Python base64-encode qui installe un stealer.',
1676
+ references: [
1677
+ 'https://blog.pypi.org/posts/2026-03-24-litellm-compromise/',
1678
+ 'https://attack.mitre.org/techniques/T1546/004/'
1679
+ ],
1680
+ mitre: 'T1546.004'
1681
+ },
1670
1682
  npm_token_steal: {
1671
1683
  id: 'MUADDIB-AST-060',
1672
1684
  name: 'NPM Token Extraction via CLI',
@@ -1201,6 +1201,17 @@ function handleCallExpression(node, ctx) {
1201
1201
  file: ctx.relFile
1202
1202
  });
1203
1203
  }
1204
+ // Detect writes to .pth files — Python auto-exec persistence (LiteLLM/Checkmarx T1546.004)
1205
+ // .pth files in site-packages/ are executed automatically by the Python interpreter at startup.
1206
+ // No legitimate npm package creates .pth files.
1207
+ if (sdPathStr && /\.pth$/i.test(sdPathStr)) {
1208
+ ctx.threats.push({
1209
+ type: 'pth_persistence',
1210
+ severity: 'CRITICAL',
1211
+ message: `${sdWriteMethod}() writes to Python .pth file: "${sdPathStr.substring(0, 80)}" — auto-exec persistence technique (LiteLLM/Checkmarx).`,
1212
+ file: ctx.relFile
1213
+ });
1214
+ }
1204
1215
  }
1205
1216
  }
1206
1217
 
@@ -1000,7 +1000,8 @@ const SENSITIVE_PATH_PATTERNS = [
1000
1000
  '_cacache', '.cache/yarn', '.cache/pip',
1001
1001
  // P6: Removed discord, leveldb — data directories, not credential paths.
1002
1002
  // _cacache/.cache kept — real cache poisoning vectors (T1195.002).
1003
- '/proc/mem', '/proc/self' // v2.10.11: runner secret extraction from process memory (TeamPCP Trivy stealer)
1003
+ '/proc/mem', '/proc/self', // v2.10.11: runner secret extraction from process memory (TeamPCP Trivy stealer)
1004
+ '.config/sysmon' // v2.10.13: LiteLLM/Checkmarx credential stealer staging path
1004
1005
  ];
1005
1006
 
1006
1007
  function isSensitivePath(val) {