@remnux/mcp-server 0.1.73 → 0.1.74

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.
Files changed (40) hide show
  1. package/README.md +12 -0
  2. package/dist/analysis/summarizer.d.ts +25 -1
  3. package/dist/analysis/summarizer.d.ts.map +1 -1
  4. package/dist/analysis/summarizer.js +38 -11
  5. package/dist/analysis/summarizer.js.map +1 -1
  6. package/dist/handlers/analyze-file.d.ts +15 -0
  7. package/dist/handlers/analyze-file.d.ts.map +1 -1
  8. package/dist/handlers/analyze-file.js +84 -55
  9. package/dist/handlers/analyze-file.js.map +1 -1
  10. package/dist/parsers/1768.d.ts +19 -0
  11. package/dist/parsers/1768.d.ts.map +1 -0
  12. package/dist/parsers/1768.js +120 -0
  13. package/dist/parsers/1768.js.map +1 -0
  14. package/dist/parsers/capa.d.ts.map +1 -1
  15. package/dist/parsers/capa.js +2 -1
  16. package/dist/parsers/capa.js.map +1 -1
  17. package/dist/parsers/diec.d.ts.map +1 -1
  18. package/dist/parsers/diec.js +2 -1
  19. package/dist/parsers/diec.js.map +1 -1
  20. package/dist/parsers/floss.d.ts.map +1 -1
  21. package/dist/parsers/floss.js +3 -1
  22. package/dist/parsers/floss.js.map +1 -1
  23. package/dist/parsers/index.d.ts +3 -3
  24. package/dist/parsers/index.d.ts.map +1 -1
  25. package/dist/parsers/index.js +8 -4
  26. package/dist/parsers/index.js.map +1 -1
  27. package/dist/parsers/types.d.ts +8 -1
  28. package/dist/parsers/types.d.ts.map +1 -1
  29. package/dist/parsers/yara.d.ts +18 -4
  30. package/dist/parsers/yara.d.ts.map +1 -1
  31. package/dist/parsers/yara.js +89 -48
  32. package/dist/parsers/yara.js.map +1 -1
  33. package/dist/tools/advisories.d.ts +3 -0
  34. package/dist/tools/advisories.d.ts.map +1 -1
  35. package/dist/tools/advisories.js +3 -12
  36. package/dist/tools/advisories.js.map +1 -1
  37. package/dist/tools/definitions.d.ts.map +1 -1
  38. package/dist/tools/definitions.js +4 -0
  39. package/dist/tools/definitions.js.map +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Parser for 1768.py, Didier Stevens' Cobalt Strike beacon configuration extractor.
3
+ *
4
+ * 1768 exits 0 whether or not it succeeds. When it cannot process a file it says so
5
+ * on stderr ("Error opening file ...", "Number of errors: N"), and the parser reports
6
+ * that as tool_reported_error. "Error: ..." lines on stdout, such as "payload size too
7
+ * large", are its probe results on a file without a beacon, not failures. A recovered
8
+ * configuration is one line per setting, led by Cobalt Strike's own setting number,
9
+ * followed by 1768's verdict, "Sanity check Cobalt Strike config: OK" (or NOK):
10
+ *
11
+ * 0x0001 payload type 0x0001 0x0002 0 windows-beacon_http-reverse_http
12
+ * 0x0008 server,get-uri 0x0003 0x0100 '<host>,/<uri>'
13
+ *
14
+ * Recognition keys on the setting numbers and the verdict, which are stable across
15
+ * releases. Setting names are display text, used only as labels.
16
+ */
17
+ /** Setting number, display name (may be empty), type, length, then the decoded value. */
18
+ const CONFIG_ENTRY = /^0x([0-9a-f]{4})\s+(.*?)\s*0x[0-9a-f]{4} 0x[0-9a-f]{4}(?:\s+(.*))?$/i;
19
+ /** Any line led by a setting number, whatever the rest of its layout. */
20
+ const SETTING_NUMBER = /^0x([0-9a-f]{4})\b/i;
21
+ /** "Sanity check <subject>: <verdict>", counted only when the subject is a Cobalt Strike config. */
22
+ const SANITY_VERDICT = /^sanity check\b([^:]*):\s*(\S+)/i;
23
+ const COBALT_STRIKE = /cobalt\s*strike/i;
24
+ /** The header 1768 prints for every file it processes. */
25
+ const FILE_HEADER = /^File:/m;
26
+ /** 1768's failure reports: "Error: ..." lines, its "Number of errors: N" tally, or a traceback. */
27
+ const ERROR_RECORDS = [/^error\b/im, /^number of errors:\s*[1-9]/im, /^Traceback \(most recent call last\):/m];
28
+ /** Payload type, port, C2 server and URI, POST URI, and license ID: the values an analyst pivots on. */
29
+ const KEY_SETTINGS = new Set(["0001", "0002", "0008", "000a", "0025"]);
30
+ const MAX_SETTING_FINDINGS = 15;
31
+ const MAX_VALUE = 200;
32
+ /** Replace anything outside printable ASCII and cap the length before quoting a value back. */
33
+ function printable(s) {
34
+ const p = s.replace(/[^ -~]/g, "?");
35
+ return p.length > MAX_VALUE ? `${p.slice(0, MAX_VALUE)}…` : p;
36
+ }
37
+ export function parse1768Output(rawOutput, ctx) {
38
+ const result = {
39
+ tool: "1768",
40
+ parsed: false,
41
+ findings: [],
42
+ metadata: {},
43
+ raw: rawOutput,
44
+ };
45
+ // Failure records count on stderr, or in output that is not 1768's normal report (no
46
+ // File: header, as when stderr stands in for empty stdout). On its normal stdout they are
47
+ // probe results.
48
+ const stderr = ctx?.stderr ?? "";
49
+ const hasHeader = FILE_HEADER.test(rawOutput);
50
+ const reportedError = ERROR_RECORDS.some((re) => re.test(stderr) || (!hasHeader && re.test(rawOutput)));
51
+ if (reportedError)
52
+ result.metadata.tool_reported_error = true;
53
+ if (!hasHeader) {
54
+ // Without the header, 1768 either failed before processing the file (and said so)
55
+ // or printed a format this parser does not know.
56
+ if (reportedError)
57
+ result.parsed = true;
58
+ else
59
+ result.metadata.parse_error = true;
60
+ return result;
61
+ }
62
+ result.parsed = true;
63
+ let ok = 0;
64
+ let nok = 0;
65
+ let other = 0;
66
+ const settingNumbers = new Set();
67
+ const settings = [];
68
+ let omitted = 0;
69
+ for (const line of rawOutput.split("\n")) {
70
+ // Configuration lines start at column 0. Decoded profile instructions are indented.
71
+ if (!line || /^\s/.test(line))
72
+ continue;
73
+ const text = line.trim();
74
+ const sanity = text.match(SANITY_VERDICT);
75
+ if (sanity) {
76
+ if (!COBALT_STRIKE.test(sanity[1]))
77
+ continue;
78
+ const verdict = sanity[2].toUpperCase();
79
+ if (verdict === "OK")
80
+ ok++;
81
+ else if (verdict === "NOK")
82
+ nok++;
83
+ else
84
+ other++;
85
+ continue;
86
+ }
87
+ const numbered = text.match(SETTING_NUMBER);
88
+ if (numbered && numbered[1] !== "0000")
89
+ settingNumbers.add(numbered[1].toLowerCase());
90
+ const entry = text.match(CONFIG_ENTRY);
91
+ if (!entry || !KEY_SETTINGS.has(entry[1].toLowerCase()) || !entry[3])
92
+ continue;
93
+ if (settings.length >= MAX_SETTING_FINDINGS) {
94
+ omitted++;
95
+ continue;
96
+ }
97
+ const id = entry[1].toLowerCase();
98
+ const label = printable(entry[2].trim()) || "unnamed";
99
+ settings.push({
100
+ description: `Cobalt Strike setting ${label} (0x${id}): ${printable(entry[3])}`,
101
+ category: "cobalt-strike-setting",
102
+ severity: "info",
103
+ evidence: printable(text),
104
+ });
105
+ }
106
+ // One numbered line is not a configuration. A real one has dozens of settings.
107
+ if (ok + nok + other === 0 && settingNumbers.size < 2)
108
+ return result;
109
+ const verdict = ok > 0 ? "OK" : nok > 0 ? "NOK" : "not recognized";
110
+ result.findings.push({
111
+ description: `Cobalt Strike beacon configuration recovered by 1768 (sanity check: ${verdict})`,
112
+ category: "cobalt-strike-config",
113
+ severity: ok > 0 ? "high" : nok > 0 ? "low" : "medium",
114
+ evidence: `${settingNumbers.size} setting numbers, sanity verdicts ${ok} OK / ${nok} NOK / ${other} other` +
115
+ (omitted > 0 ? `, ${omitted} more setting values not listed` : ""),
116
+ });
117
+ result.findings.push(...settings);
118
+ return result;
119
+ }
120
+ //# sourceMappingURL=1768.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1768.js","sourceRoot":"","sources":["../../src/parsers/1768.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"capa.d.ts","sourceRoot":"","sources":["../../src/parsers/capa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAW,YAAY,EAAE,MAAM,YAAY,CAAC;AAsG1E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,CA4B7F;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAsEnE"}
1
+ {"version":3,"file":"capa.d.ts","sourceRoot":"","sources":["../../src/parsers/capa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAW,YAAY,EAAE,MAAM,YAAY,CAAC;AAsG1E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,CA4B7F;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAuEnE"}
@@ -204,7 +204,8 @@ export function parseCapaOutput(rawOutput) {
204
204
  }
205
205
  }
206
206
  catch {
207
- // JSON parse failed — return unparsed
207
+ // Not capa's JSON (cut short, or something else printed instead), so nothing was read.
208
+ result.metadata.parse_error = true;
208
209
  }
209
210
  return result;
210
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"capa.js","sourceRoot":"","sources":["../../src/parsers/capa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capa.js","sourceRoot":"","sources":["../../src/parsers/capa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;GAQG;AACH,MAAM,qBAAqB,GAAiC;IAC1D,yDAAyD;IACzD,MAAM,EAAE,UAAU;IAClB,SAAS,EAAE,UAAU;IACrB,KAAK,EAAE,UAAU;IACjB,KAAK,EAAE,UAAU;IACjB,2EAA2E;IAC3E,GAAG,EAAE,UAAU;IACf,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,wCAAwC;IACxC,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,uCAAuC;IACvC,MAAM,EAAE,SAAS;IACjB,2EAA2E;IAC3E,sEAAsE;IACtE,2EAA2E;IAC3E,oEAAoE;CACrE,CAAC;AAEF;;;;GAIG;AACH,MAAM,4BAA4B,GAAiC;IACjE,2CAA2C;IAC3C,aAAa,EAAE,YAAY;IAC3B,YAAY,EAAE,YAAY;IAC1B,kBAAkB,EAAE,YAAY;IAChC,+DAA+D;IAC/D,cAAc,EAAE,UAAU;IAC1B,4CAA4C;IAC5C,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,UAAU;IACxB,gBAAgB,EAAE,UAAU;IAC5B,KAAK,EAAE,UAAU;IACjB,YAAY,EAAE,UAAU;IACxB,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,UAAU;IACvB,oBAAoB,EAAE,UAAU;IAChC,eAAe,EAAE,UAAU;IAC3B,gBAAgB,EAAE,UAAU;CAC7B,CAAC;AAEF,mFAAmF;AACnF,MAAM,mBAAmB,GAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAE9F;;;;;;GAMG;AACH,SAAS,2BAA2B,CAAC,IAAa,EAAE,GAAsB;IACxE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC9C,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,8EAA8E;IAC9E,iFAAiF;IACjF,iFAAiF;IACjF,iFAAiF;IACjF,6EAA6E;IAC7E,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO;IAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;YAC/C,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;YAClB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,IAAI,EAAE,KAAK,gBAAgB,EAAE,CAAC;oBAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzE,MAAM,EAAE,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;oBAC7C,IAAI,EAAE;wBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;oBACrC,IAAI,EAAE;wBAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;YAAE,2BAA2B,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC/D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;QAEtC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC7B,qCAAqC;gBACrC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACtC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,EAAE,GAAI,IAAgC,CAAC,SAAS,CAAC;YACvD,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;oBAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;qBAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;oBAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACvC,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,MAAM,GAAqB;QAC/B,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,GAAG,EAAE,SAAS;KACf,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;QAErB,6BAA6B;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,SAAS;gBAChD,MAAM,CAAC,GAAG,IAA+B,CAAC;gBAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;gBACpB,MAAM,OAAO,GAAY;oBACvB,WAAW,EAAE,IAAI;oBACjB,QAAQ,EAAE,YAAY;oBACtB,QAAQ,EAAE,MAAM;iBACjB,CAAC;gBAEF,4DAA4D;gBAC5D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7D,MAAM,CAAC,GAAG,IAA+B,CAAC;oBAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM;6BACxB,MAAM,CAAC,CAAC,CAAC,EAA+B,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;6BACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC;6BACpD,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;gBAED,wEAAwE;gBACxE,sEAAsE;gBACtE,wEAAwE;gBACxE,0CAA0C;gBAC1C,MAAM,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,aAAa;oBAAE,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC;gBAE1D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChD,CAAC;QAED,yDAAyD;QACzD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,kBAAkB;gBAChC,mDAAmD;oBACnD,+EAA+E;oBAC/E,4DAA4D;oBAC5D,2DAA2D;oBAC3D,6CAA6C;oBAC7C,0DAA0D;oBAC1D,wEAAwE,CAAC;QAC7E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uFAAuF;QACvF,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"diec.d.ts","sourceRoot":"","sources":["../../src/parsers/diec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,YAAY,CAAC;AAuB5D,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAiDnE"}
1
+ {"version":3,"file":"diec.d.ts","sourceRoot":"","sources":["../../src/parsers/diec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAW,MAAM,YAAY,CAAC;AAuB5D,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAkDnE"}
@@ -70,7 +70,8 @@ export function parseDiecOutput(rawOutput) {
70
70
  }
71
71
  }
72
72
  catch {
73
- // JSON parse failed — return unparsed
73
+ // No diec JSON in the output, so nothing was read.
74
+ result.metadata.parse_error = true;
74
75
  }
75
76
  return result;
76
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diec.js","sourceRoot":"","sources":["../../src/parsers/diec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diec.js","sourceRoot":"","sources":["../../src/parsers/diec.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"floss.d.ts","sourceRoot":"","sources":["../../src/parsers/floss.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAenD,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAuB,GAC/B,gBAAgB,CA6ElB"}
1
+ {"version":3,"file":"floss.d.ts","sourceRoot":"","sources":["../../src/parsers/floss.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAenD,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAuB,GAC/B,gBAAgB,CA+ElB"}
@@ -38,7 +38,9 @@ export function parseFlossOutput(rawOutput, options = {}) {
38
38
  const lower = trimmed.toLowerCase();
39
39
  // Match "─── FLOSS DECODED STRINGS ───" or "FLOSS DECODED STRINGS" or just "DECODED STRINGS"
40
40
  const stripped = lower.replace(/[─━═\-]/g, "").trim();
41
- if (SECTION_HEADERS[stripped]) {
41
+ // Own properties only: these lines are the sample's strings, and a string such as
42
+ // "constructor" would otherwise match an inherited property.
43
+ if (Object.hasOwn(SECTION_HEADERS, stripped)) {
42
44
  currentSection = SECTION_HEADERS[stripped];
43
45
  continue;
44
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"floss.js","sourceRoot":"","sources":["../../src/parsers/floss.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"floss.js","sourceRoot":"","sources":["../../src/parsers/floss.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,14 @@
3
3
  *
4
4
  * Falls back to passthrough for tools without a dedicated parser.
5
5
  */
6
- import type { ParsedToolOutput } from "./types.js";
6
+ import type { ParsedToolOutput, ParseContext } from "./types.js";
7
7
  /**
8
8
  * Parse tool output using a registered parser, or passthrough if none exists.
9
9
  */
10
- export declare function parseToolOutput(toolName: string, rawOutput: string): ParsedToolOutput;
10
+ export declare function parseToolOutput(toolName: string, rawOutput: string, ctx?: ParseContext): ParsedToolOutput;
11
11
  /**
12
12
  * Check if a dedicated parser exists for the given tool.
13
13
  */
14
14
  export declare function hasParser(toolName: string): boolean;
15
- export type { ParsedToolOutput, ToolOutputParser, Finding } from "./types.js";
15
+ export type { ParsedToolOutput, ToolOutputParser, ParseContext, Finding } from "./types.js";
16
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AA2BrE;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAMrF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAoB,YAAY,EAAE,MAAM,YAAY,CAAC;AA+BnF;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,YAAY,GACjB,gBAAgB,CAMlB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
@@ -13,7 +13,8 @@ import { parseOleidOutput } from "./oleid.js";
13
13
  import { parseReadelfOutput } from "./readelf.js";
14
14
  import { parsePdfParserOutput } from "./pdf-parser.js";
15
15
  import { parseFlossOutput } from "./floss.js";
16
- import { parseYaraOutput } from "./yara.js";
16
+ import { parseYaraOutput, parseYaraForgeOutput } from "./yara.js";
17
+ import { parse1768Output } from "./1768.js";
17
18
  /** Map of tool name → parser function. */
18
19
  const PARSERS = {
19
20
  "capa": parseCapaOutput,
@@ -24,16 +25,19 @@ const PARSERS = {
24
25
  "peframe": parsePeframeOutput,
25
26
  "oleid": parseOleidOutput,
26
27
  "readelf-header": parseReadelfOutput,
27
- "floss": parseFlossOutput,
28
+ // parseFlossOutput's second parameter is its own options object, not a ParseContext.
29
+ "floss": (rawOutput) => parseFlossOutput(rawOutput),
28
30
  "yara-rules": parseYaraOutput,
31
+ "yara-forge": parseYaraForgeOutput,
32
+ "1768": parse1768Output,
29
33
  };
30
34
  /**
31
35
  * Parse tool output using a registered parser, or passthrough if none exists.
32
36
  */
33
- export function parseToolOutput(toolName, rawOutput) {
37
+ export function parseToolOutput(toolName, rawOutput, ctx) {
34
38
  const parser = PARSERS[toolName];
35
39
  if (parser) {
36
- return parser(rawOutput);
40
+ return parser(rawOutput, ctx);
37
41
  }
38
42
  return passthroughParser(toolName, rawOutput);
39
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,0CAA0C;AAC1C,MAAM,OAAO,GAAqC;IAChD,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,oBAAoB;IAClC,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,kBAAkB;IAC7B,OAAO,EAAE,gBAAgB;IACzB,gBAAgB,EAAE,kBAAkB;IACpC,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,eAAe;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAiB;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,QAAQ,IAAI,OAAO,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parsers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,0CAA0C;AAC1C,MAAM,OAAO,GAAqC;IAChD,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,oBAAoB;IAClC,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,kBAAkB;IAC7B,OAAO,EAAE,gBAAgB;IACzB,gBAAgB,EAAE,kBAAkB;IACpC,qFAAqF;IACrF,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC;IACnD,YAAY,EAAE,eAAe;IAC7B,YAAY,EAAE,oBAAoB;IAClC,MAAM,EAAE,eAAe;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,SAAiB,EACjB,GAAkB;IAElB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,QAAQ,IAAI,OAAO,CAAC;AAC7B,CAAC"}
@@ -44,6 +44,13 @@ export interface ParsedToolOutput {
44
44
  /** Raw output preserved for reference */
45
45
  raw: string;
46
46
  }
47
+ /** What the server knows about the run that produced the output. Optional throughout. */
48
+ export interface ParseContext {
49
+ /** Absolute path the tool was pointed at, when the server built the command. */
50
+ targetPath?: string;
51
+ /** The tool's stderr, for a tool that reports failures there while exiting 0. */
52
+ stderr?: string;
53
+ }
47
54
  /** A parser function: takes raw output, returns structured data. */
48
- export type ToolOutputParser = (rawOutput: string) => ParsedToolOutput;
55
+ export type ToolOutputParser = (rawOutput: string, ctx?: ParseContext) => ParsedToolOutput;
49
56
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parsers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mDAAmD;AACnD,MAAM,WAAW,OAAO;IACtB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAC3D,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9E,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,MAAM,EAAE,OAAO,CAAC;IAChB,kCAAkC;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,oEAAoE;AACpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parsers/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,mDAAmD;AACnD,MAAM,WAAW,OAAO;IACtB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAC3D,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAE9E,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,MAAM,EAAE,OAAO,CAAC;IAChB,kCAAkC;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oEAAoE;AACpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,KAAK,gBAAgB,CAAC"}
@@ -1,8 +1,22 @@
1
1
  /**
2
- * Parser for yara-rules output.
2
+ * Parser for YARA scanner output (yara-rules and yara-forge).
3
3
  *
4
- * Deduplicates packer-family rule variants (e.g., 24 PECompact rules → 1 finding with count).
4
+ * YARA prints one line per matched rule, `[namespace:]rule [tags] [meta] <scanned path>`,
5
+ * and writes its warnings and errors to stderr. For yara-rules, packer-family rule
6
+ * variants are deduplicated (e.g., 24 PECompact rules → 1 finding with count); for
7
+ * yara-forge, whose rules name malware families, each matched rule is its own finding.
5
8
  */
6
- import type { ParsedToolOutput } from "./types.js";
7
- export declare function parseYaraOutput(rawOutput: string): ParsedToolOutput;
9
+ import type { ParsedToolOutput, ParseContext } from "./types.js";
10
+ /**
11
+ * The rules a YARA run matched, in first-seen order.
12
+ *
13
+ * A match line starts with a rule identifier and names the scanned file. When the
14
+ * caller knows that file (`targetPath`), the line must end with it; otherwise it must
15
+ * carry at least one more token. Nothing else counts: not the server's "(no output)"
16
+ * placeholder, not a warning or error line, and not an indented or `-s` detail line.
17
+ */
18
+ export declare function extractYaraRuleMatches(rawOutput: string, targetPath?: string): string[];
19
+ export declare function parseYaraOutput(rawOutput: string, ctx?: ParseContext, toolName?: "yara-rules" | "yara-forge"): ParsedToolOutput;
20
+ /** Parser entry for yara-forge (family-attribution ruleset). */
21
+ export declare const parseYaraForgeOutput: (rawOutput: string, ctx?: ParseContext) => ParsedToolOutput;
8
22
  //# sourceMappingURL=yara.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"yara.d.ts","sourceRoot":"","sources":["../../src/parsers/yara.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAwBnD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAkEnE"}
1
+ {"version":3,"file":"yara.d.ts","sourceRoot":"","sources":["../../src/parsers/yara.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8BjE;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBvF;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,YAAY,EAClB,QAAQ,GAAE,YAAY,GAAG,YAA2B,GACnD,gBAAgB,CAiElB;AAED,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,GAAI,WAAW,MAAM,EAAE,MAAM,YAAY,KAAG,gBAC9B,CAAC"}
@@ -1,7 +1,10 @@
1
1
  /**
2
- * Parser for yara-rules output.
2
+ * Parser for YARA scanner output (yara-rules and yara-forge).
3
3
  *
4
- * Deduplicates packer-family rule variants (e.g., 24 PECompact rules → 1 finding with count).
4
+ * YARA prints one line per matched rule, `[namespace:]rule [tags] [meta] <scanned path>`,
5
+ * and writes its warnings and errors to stderr. For yara-rules, packer-family rule
6
+ * variants are deduplicated (e.g., 24 PECompact rules → 1 finding with count); for
7
+ * yara-forge, whose rules name malware families, each matched rule is its own finding.
5
8
  */
6
9
  /** Patterns that indicate packer-family rule variants. */
7
10
  const PACKER_FAMILY_PATTERNS = [
@@ -24,65 +27,103 @@ function getPackerFamily(ruleName) {
24
27
  }
25
28
  return null;
26
29
  }
27
- export function parseYaraOutput(rawOutput) {
30
+ /** A YARA rule identifier, optionally namespace-qualified. */
31
+ const RULE_NAME = /^(?:[^\s:]+:)?[A-Za-z_][A-Za-z0-9_]*$/;
32
+ /** YARA's own diagnostics, which reach the parser when stderr stands in for empty stdout. */
33
+ const DIAGNOSTIC = /^(?:warning|error)\b/i;
34
+ /**
35
+ * The rules a YARA run matched, in first-seen order.
36
+ *
37
+ * A match line starts with a rule identifier and names the scanned file. When the
38
+ * caller knows that file (`targetPath`), the line must end with it; otherwise it must
39
+ * carry at least one more token. Nothing else counts: not the server's "(no output)"
40
+ * placeholder, not a warning or error line, and not an indented or `-s` detail line.
41
+ */
42
+ export function extractYaraRuleMatches(rawOutput, targetPath) {
43
+ // Lines are compared trimmed, and connectors trim captured output, so trim the path too.
44
+ const target = targetPath?.trim();
45
+ const rules = [];
46
+ for (const rawLine of rawOutput.split("\n")) {
47
+ if (/^\s/.test(rawLine))
48
+ continue;
49
+ const line = rawLine.trim();
50
+ if (!line || DIAGNOSTIC.test(line))
51
+ continue;
52
+ const space = line.search(/\s/);
53
+ if (space === -1)
54
+ continue;
55
+ const rule = line.slice(0, space);
56
+ if (!RULE_NAME.test(rule))
57
+ continue;
58
+ if (target && !line.endsWith(` ${target}`))
59
+ continue;
60
+ if (!rules.includes(rule))
61
+ rules.push(rule);
62
+ }
63
+ return rules;
64
+ }
65
+ export function parseYaraOutput(rawOutput, ctx, toolName = "yara-rules") {
28
66
  const result = {
29
- tool: "yara-rules",
67
+ tool: toolName,
30
68
  parsed: false,
31
69
  findings: [],
32
70
  metadata: {},
33
71
  raw: rawOutput,
34
72
  };
35
- const lines = rawOutput.split("\n").filter((l) => l.trim());
36
- if (lines.length === 0)
37
- return result;
38
- // YARA output format: "RuleName filePath" per line
39
- const ruleNames = [];
40
- for (const line of lines) {
41
- const match = line.match(/^(\S+)\s+/);
42
- if (match)
43
- ruleNames.push(match[1]);
44
- }
73
+ const ruleNames = extractYaraRuleMatches(rawOutput, ctx?.targetPath);
45
74
  if (ruleNames.length === 0)
46
75
  return result;
47
- // Group by packer family for deduplication
48
- const packerGroups = new Map();
49
- const nonPackerRules = [];
50
- for (const name of ruleNames) {
51
- const family = getPackerFamily(name);
52
- if (family) {
53
- const existing = packerGroups.get(family) ?? [];
54
- existing.push(name);
55
- packerGroups.set(family, existing);
56
- }
57
- else {
58
- nonPackerRules.push(name);
76
+ if (toolName === "yara-forge") {
77
+ for (const name of ruleNames) {
78
+ result.findings.push({
79
+ description: `YARA family signature: ${name}`,
80
+ category: "yara-family",
81
+ severity: "medium",
82
+ evidence: name,
83
+ });
59
84
  }
60
85
  }
61
- // Emit deduplicated packer findings
62
- for (const [family, variants] of packerGroups) {
63
- result.findings.push({
64
- description: variants.length > 1
65
- ? `Packer: ${family} (${variants.length} rule variants matched)`
66
- : `Packer: ${family}`,
67
- category: "packer",
68
- severity: "medium",
69
- evidence: variants.length <= 3 ? variants.join(", ") : `${variants.slice(0, 3).join(", ")} +${variants.length - 3} more`,
70
- });
71
- }
72
- // Emit individual non-packer rules
73
- for (const name of nonPackerRules) {
74
- result.findings.push({
75
- description: `YARA match: ${name}`,
76
- category: "yara-match",
77
- severity: "low",
78
- evidence: name,
79
- });
86
+ else {
87
+ // Group by packer family for deduplication
88
+ const packerGroups = new Map();
89
+ const nonPackerRules = [];
90
+ for (const name of ruleNames) {
91
+ const family = getPackerFamily(name);
92
+ if (family) {
93
+ const existing = packerGroups.get(family) ?? [];
94
+ existing.push(name);
95
+ packerGroups.set(family, existing);
96
+ }
97
+ else {
98
+ nonPackerRules.push(name);
99
+ }
100
+ }
101
+ // Emit deduplicated packer findings
102
+ for (const [family, variants] of packerGroups) {
103
+ result.findings.push({
104
+ description: variants.length > 1
105
+ ? `Packer: ${family} (${variants.length} rule variants matched)`
106
+ : `Packer: ${family}`,
107
+ category: "packer",
108
+ severity: "medium",
109
+ evidence: variants.length <= 3 ? variants.join(", ") : `${variants.slice(0, 3).join(", ")} +${variants.length - 3} more`,
110
+ });
111
+ }
112
+ // Emit individual non-packer rules
113
+ for (const name of nonPackerRules) {
114
+ result.findings.push({
115
+ description: `YARA match: ${name}`,
116
+ category: "yara-match",
117
+ severity: "low",
118
+ evidence: name,
119
+ });
120
+ }
80
121
  }
81
122
  result.metadata.total_rules_matched = ruleNames.length;
82
123
  result.metadata.deduplicated_findings = result.findings.length;
83
- if (result.findings.length > 0) {
84
- result.parsed = true;
85
- }
124
+ result.parsed = true;
86
125
  return result;
87
126
  }
127
+ /** Parser entry for yara-forge (family-attribution ruleset). */
128
+ export const parseYaraForgeOutput = (rawOutput, ctx) => parseYaraOutput(rawOutput, ctx, "yara-forge");
88
129
  //# sourceMappingURL=yara.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yara.js","sourceRoot":"","sources":["../../src/parsers/yara.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yara.js","sourceRoot":"","sources":["../../src/parsers/yara.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,0DAA0D;AAC1D,MAAM,sBAAsB,GAAG;IAC7B,yBAAyB;IACzB,mBAAmB;IACnB,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;IACtB,yBAAyB;IACzB,sBAAsB;IACtB,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;CACvB,CAAC;AAEF,SAAS,eAAe,CAAC,QAAgB;IACvC,KAAK,MAAM,OAAO,IAAI,sBAAsB,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8DAA8D;AAC9D,MAAM,SAAS,GAAG,uCAAuC,CAAC;AAE1D,6FAA6F;AAC7F,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,UAAmB;IAC3E,yFAAyF;IACzF,MAAM,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAS;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,SAAS;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACpC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;YAAE,SAAS;QACrD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,GAAkB,EAClB,WAAwC,YAAY;IAEpD,MAAM,MAAM,GAAqB;QAC/B,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,GAAG,EAAE,SAAS;KACf,CAAC;IAEF,MAAM,SAAS,GAAG,sBAAsB,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnB,WAAW,EAAE,0BAA0B,IAAI,EAAE;gBAC7C,QAAQ,EAAE,aAAa;gBACvB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,2CAA2C;QAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;QACjD,MAAM,cAAc,GAAa,EAAE,CAAC;QAEpC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC;YAC9C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnB,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;oBAC9B,CAAC,CAAC,WAAW,MAAM,KAAK,QAAQ,CAAC,MAAM,yBAAyB;oBAChE,CAAC,CAAC,WAAW,MAAM,EAAE;gBACvB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,OAAO;aACzH,CAAC,CAAC;QACL,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnB,WAAW,EAAE,eAAe,IAAI,EAAE;gBAClC,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,mBAAmB,GAAG,SAAS,CAAC,MAAM,CAAC;IACvD,MAAM,CAAC,QAAQ,CAAC,qBAAqB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC/D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;IAErB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,SAAiB,EAAE,GAAkB,EAAoB,EAAE,CAC9F,eAAe,CAAC,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC"}
@@ -4,6 +4,7 @@
4
4
  * These advisories evaluate results across multiple tools to surface
5
5
  * actionable guidance that individual tools can't provide alone.
6
6
  */
7
+ import type { Finding } from "../parsers/types.js";
7
8
  export interface PostAnalysisAdvisory {
8
9
  name: string;
9
10
  priority: number;
@@ -12,10 +13,12 @@ export interface PostAnalysisAdvisory {
12
13
  remediation: string;
13
14
  }
14
15
  export interface AdvisoryContext {
16
+ /** `findings` are what the tool's parser resolved, when it has one. */
15
17
  toolsRun: Array<{
16
18
  name: string;
17
19
  exit_code?: number;
18
20
  output?: string;
21
+ findings?: Finding[];
19
22
  }>;
20
23
  toolsFailed?: Array<{
21
24
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"advisories.d.ts","sourceRoot":"","sources":["../../src/tools/advisories.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,EAgH1D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,GACvB,oBAAoB,EAAE,CAIxB"}
1
+ {"version":3,"file":"advisories.d.ts","sourceRoot":"","sources":["../../src/tools/advisories.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7F,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,wBAAwB,EAAE,oBAAoB,EAyG1D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,GACvB,oBAAoB,EAAE,CAIxB"}
@@ -80,18 +80,9 @@ export const POST_ANALYSIS_ADVISORIES = [
80
80
  {
81
81
  name: "yara-family-attribution",
82
82
  priority: 7,
83
- shouldApply: (ctx) => {
84
- const forge = ctx.toolsRun.find((t) => t.name === "yara-forge");
85
- if (!forge?.output)
86
- return false;
87
- const lines = forge.output.trim().split("\n");
88
- return lines.some((line) => {
89
- const trimmed = line.trim();
90
- return trimmed.length > 0 &&
91
- !trimmed.startsWith("warning:") &&
92
- !trimmed.startsWith("error:");
93
- });
94
- },
83
+ // Reads the rules yara-forge's parser resolved, so this cannot disagree with the
84
+ // tool's summary entry or the triage token.
85
+ shouldApply: (ctx) => (ctx.toolsRun.find((t) => t.name === "yara-forge")?.findings?.length ?? 0) > 0,
95
86
  issue: "YARA family signatures matched. These indicate resemblance to known malware families " +
96
87
  "based on static patterns, not confirmed attribution. Signatures can match shared code, " +
97
88
  "common libraries, or reused techniques across unrelated families.",