@runsec/mcp 1.0.35 → 1.0.37

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 (83) hide show
  1. package/dist/data/.rag-cache.json +1 -0
  2. package/dist/data/skills/_exploit_overrides.json +16 -0
  3. package/dist/data/skills/advanced-agent-cloud/index.md +94 -0
  4. package/dist/data/skills/advanced-agent-cloud/patterns.md +46 -0
  5. package/dist/data/skills/advanced-agent-cloud/skill.json +38 -0
  6. package/dist/data/skills/app-logic/index.md +69 -0
  7. package/dist/data/skills/app-logic/patterns.md +23 -0
  8. package/dist/data/skills/app-logic/skill.json +24 -0
  9. package/dist/data/skills/auth-keycloak/index.md +69 -0
  10. package/dist/data/skills/auth-keycloak/patterns.md +46 -0
  11. package/dist/data/skills/auth-keycloak/skill.json +51 -0
  12. package/dist/data/skills/browser-agent/index.md +58 -0
  13. package/dist/data/skills/browser-agent/patterns.md +15 -0
  14. package/dist/data/skills/browser-agent/skill.json +24 -0
  15. package/dist/data/skills/cloud-secrets/index.md +66 -0
  16. package/dist/data/skills/cloud-secrets/patterns.md +19 -0
  17. package/dist/data/skills/cloud-secrets/skill.json +28 -0
  18. package/dist/data/skills/csharp-dotnet/index.md +103 -0
  19. package/dist/data/skills/csharp-dotnet/patterns.md +270 -0
  20. package/dist/data/skills/csharp-dotnet/skill.json +27 -0
  21. package/dist/data/skills/desktop-vsto-suite/index.md +202 -0
  22. package/dist/data/skills/desktop-vsto-suite/patterns.md +154 -0
  23. package/dist/data/skills/desktop-vsto-suite/skill.json +26 -0
  24. package/dist/data/skills/devops-security/index.md +64 -0
  25. package/dist/data/skills/devops-security/patterns.md +23 -0
  26. package/dist/data/skills/devops-security/skill.json +42 -0
  27. package/dist/data/skills/domain-access-management/index.md +123 -0
  28. package/dist/data/skills/domain-access-management/patterns.md +58 -0
  29. package/dist/data/skills/domain-access-management/skill.json +36 -0
  30. package/dist/data/skills/domain-data-privacy/index.md +98 -0
  31. package/dist/data/skills/domain-data-privacy/patterns.md +48 -0
  32. package/dist/data/skills/domain-data-privacy/skill.json +36 -0
  33. package/dist/data/skills/domain-input-validation/index.md +210 -0
  34. package/dist/data/skills/domain-input-validation/patterns.md +158 -0
  35. package/dist/data/skills/domain-input-validation/skill.json +24 -0
  36. package/dist/data/skills/domain-platform-hardening/index.md +169 -0
  37. package/dist/data/skills/domain-platform-hardening/patterns.md +96 -0
  38. package/dist/data/skills/domain-platform-hardening/skill.json +27 -0
  39. package/dist/data/skills/ds-ml-security/patterns.md +137 -0
  40. package/dist/data/skills/fastapi-async/index.md +83 -0
  41. package/dist/data/skills/fastapi-async/patterns.md +329 -0
  42. package/dist/data/skills/fastapi-async/skill.json +32 -0
  43. package/dist/data/skills/frontend-react/index.md +26 -0
  44. package/dist/data/skills/frontend-react/patterns.md +226 -0
  45. package/dist/data/skills/frontend-react/skill.json +24 -0
  46. package/dist/data/skills/go-core/index.md +86 -0
  47. package/dist/data/skills/go-core/patterns.md +272 -0
  48. package/dist/data/skills/go-core/skill.json +22 -0
  49. package/dist/data/skills/hft-cpp-security/patterns.md +37 -0
  50. package/dist/data/skills/index.md +73 -0
  51. package/dist/data/skills/infra-k8s-helm/index.md +138 -0
  52. package/dist/data/skills/infra-k8s-helm/patterns.md +279 -0
  53. package/dist/data/skills/infra-k8s-helm/skill.json +41 -0
  54. package/dist/data/skills/integration-security/index.md +73 -0
  55. package/dist/data/skills/integration-security/patterns.md +132 -0
  56. package/dist/data/skills/integration-security/skill.json +30 -0
  57. package/dist/data/skills/java-enterprise/index.md +31 -0
  58. package/dist/data/skills/java-enterprise/patterns.md +816 -0
  59. package/dist/data/skills/java-enterprise/skill.json +26 -0
  60. package/dist/data/skills/java-spring/index.md +65 -0
  61. package/dist/data/skills/java-spring/patterns.md +22 -0
  62. package/dist/data/skills/java-spring/skill.json +23 -0
  63. package/dist/data/skills/license-compliance/index.md +58 -0
  64. package/dist/data/skills/license-compliance/patterns.md +12 -0
  65. package/dist/data/skills/license-compliance/skill.json +28 -0
  66. package/dist/data/skills/mobile-security/patterns.md +42 -0
  67. package/dist/data/skills/nodejs-nestjs/index.md +71 -0
  68. package/dist/data/skills/nodejs-nestjs/patterns.md +288 -0
  69. package/dist/data/skills/nodejs-nestjs/skill.json +24 -0
  70. package/dist/data/skills/observability/index.md +68 -0
  71. package/dist/data/skills/observability/patterns.md +22 -0
  72. package/dist/data/skills/observability/skill.json +26 -0
  73. package/dist/data/skills/php-security/patterns.md +202 -0
  74. package/dist/data/skills/ru-regulatory/index.md +72 -0
  75. package/dist/data/skills/ru-regulatory/patterns.md +28 -0
  76. package/dist/data/skills/ru-regulatory/skill.json +53 -0
  77. package/dist/data/skills/ruby-rails/index.md +65 -0
  78. package/dist/data/skills/ruby-rails/patterns.md +172 -0
  79. package/dist/data/skills/ruby-rails/skill.json +24 -0
  80. package/dist/data/skills/rust-security/patterns.md +152 -0
  81. package/dist/data/trufflehog-config.yaml +407 -0
  82. package/dist/index.js +3766 -372
  83. package/package.json +1 -1
@@ -0,0 +1,202 @@
1
+ # Desktop & Office Integration Suite
2
+
3
+ ## Stack overview
4
+
5
+ **Electron** desktop shells (renderer hardening, IPC), **.NET / VSTO** Office add-ins (legacy deserialization, XML, secrets in config), **NSIS** installers, and **document / AI client** pipelines: **xlsx** (SheetJS), **docx**/PizZip, **mammoth**, **pdfjs-dist**, **word-extractor**, **OpenAI SDK** responses, and **main-process** hardening (`nodeIntegration: false`, `contextIsolation: true`, `senderFrame` checks). Metrics are prefixed **`INS`**.
6
+
7
+ ## Top threats
8
+
9
+ - **Renderer compromise** via disabled isolation or Node in the page (`INS-001`, `INS-002`).
10
+ - **Remote code execution** through IPC bridges (`INS-003`).
11
+ - **Deserialization and XXE** in legacy .NET stacks (`INS-004`, `INS-005`).
12
+ - **Document chain:** XXE/zip-bomb/Excel formula injection (`INS-072`…`INS-091`, CWE-611/409/1236).
13
+ - **OpenAI integration:** unvalidated structured output and prompt logging (`INS-092`…`INS-099`, CWE-1027/1109/201).
14
+ - **Electron runtime:** explicit webPreferences, IPC sender validation (`INS-100`…`INS-110`).
15
+ - **Installer DLL hijacking** (`INS-006`) and **cleartext credentials** (`INS-007`).
16
+
17
+ ## Pattern catalog
18
+
19
+ Complete Anti-Pattern / Safe-Pattern definitions live in [`patterns.md`](patterns.md). The table below is a **table of contents** by metric ID.
20
+
21
+ | ID | Metric | Stack |
22
+ |---|---|---|
23
+ | `INS-001` | Electron Insecure Content Isolation | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
24
+ | `INS-002` | Electron Node Integration Leak | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
25
+ | `INS-003` | Electron Insecure IPC | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
26
+ | `INS-004` | .NET 4.8 / VSTO Legacy Deserialization | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
27
+ | `INS-005` | VSTO Insecure XML | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
28
+ | `INS-006` | NSIS DLL Hijacking | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
29
+ | `INS-007` | VSTO Cleartext Password in Config | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
30
+ | `INS-008` | Electron Production Debugging | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
31
+ | `INS-009` | Unsafe .NET deserialization in desktop stack (BinaryFormatter/JavaScriptSerializer/XmlS... | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
32
+ | `INS-010` | Dynamic assembly/type loading from untrusted concatenated input | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
33
+ | `INS-011` | Unsafe native library loading without secure search path controls | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
34
+ | `INS-012` | XXE risk: XmlDocument/XmlTextReader without `XmlResolver = null` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
35
+ | `INS-013` | Weak cryptography in .NET (`MD5`, `SHA1Managed`, `DESCryptoServiceProvider`) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
36
+ | `INS-014` | TOCTOU file race (`Check then Open`) in `System.IO` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
37
+ | `INS-015` | Unsafe impersonation lifecycle: `WindowsIdentity.Impersonate()` without guaranteed `Und... | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
38
+ | `INS-016` | Unsafe memory operations: `stackalloc`/pointer arithmetic without bounds checks | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
39
+ | `INS-017` | Integer overflow risk in buffer/array size calculations outside `checked` blocks | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
40
+ | `INS-018` | Resource lifecycle leak: missing `Dispose`/`using` for `SafeHandle`, `AutoResetEvent`, ... | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
41
+ | `INS-019` | Registry operation driven by untrusted key/value input | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
42
+ | `INS-020` | Dangerous locking primitives (`lock(this)`, `lock(typeof(...))`, `lock("string")`) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
43
+ | `INS-021` | Unmanaged memory allocation without guaranteed `FreeHGlobal` in `finally` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
44
+ | `INS-022` | IPC object without explicit security descriptor (`PipeSecurity`/`MutexSecurity`) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
45
+ | `INS-023` | Untrusted pipe name construction via string concatenation | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
46
+ | `INS-024` | Unsafe handle passing to extern methods without trust validation | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
47
+ | `INS-025` | Dangerous native interop functions imported via `[DllImport]` (`strcpy`, `strcat`, `gets`) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
48
+ | `INS-026` | Reflection-based instance creation from untrusted type names | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
49
+ | `INS-027` | Sensitive secrets stored in immutable `string` objects in memory | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
50
+ | `INS-028` | Exception swallowing: empty `catch { }` without logging or rethrow | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
51
+ | `INS-029` | Unchecked WinAPI return codes (`BOOL`/`HRESULT`) from `[DllImport]` calls | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
52
+ | `INS-030` | COM object lifecycle leak: missing `Marshal.ReleaseComObject()` in `try/finally` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
53
+ | `INS-031` | Hardcoded cryptographic keys in `AesManaged` / `RSACryptoServiceProvider` initialization | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
54
+ | `INS-032` | Insecure random generation for crypto material using `System.Random` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
55
+ | `INS-033` | Weak RSA key size (<2048 bits) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
56
+ | `INS-034` | Hardcoded `AesManaged` Key/IV byte arrays in code | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
57
+ | `INS-035` | `System.Random` used for auth token or cryptographic salt generation | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
58
+ | `INS-036` | Unsafe dynamic JSON deserialization: `JsonConvert.DeserializeObject<dynamic>(...)` with... | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
59
+ | `INS-037` | `XmlDocument.LoadXml()` without DTD/entities hardening | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
60
+ | `INS-038` | `WebBrowser.Navigate(userUrl)` without strict protocol allowlist (https only) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
61
+ | `INS-039` | Debug-only bypass methods disable SSL/license checks via `[Conditional("DEBUG")]` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
62
+ | `INS-040` | Accessing `Globals.ThisAddIn.Application` from background thread without marshaling/invoke | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
63
+ | `INS-041` | Missing Electron CSP `frame-ancestors 'none'` in main process response headers (CWE-1021) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
64
+ | `INS-042` | Incorrect native buffer size for marshaling fixed structs (CWE-131) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
65
+ | `INS-043` | Off-by-one allocation for UTF-16 interop strings (CWE-131) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
66
+ | `INS-044` | `StructureToPtr` writes larger structure into undersized unmanaged buffer (CWE-131) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
67
+ | `INS-045` | `Marshal.Copy` length driven by untrusted value without bounds check (CWE-131) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
68
+ | `INS-046` | Detailed debug message disclosure in production logs/UI (CWE-1295) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
69
+ | `INS-047` | Electron main process logs verbose Chromium crash/debug details in production (CWE-1295) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
70
+ | `INS-048` | Electron `webContents` permission handler allows all requests | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
71
+ | `INS-049` | Unsafe `shell.openExternal` with unvalidated URL schemes | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
72
+ | `INS-050` | Disabled Electron process sandbox in production window config | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
73
+ | `INS-051` | Broad IPC surface: generic channels without argument schema validation | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
74
+ | `INS-052` | Unverified auto-update feed/signature in desktop updater | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
75
+ | `INS-053` | VSTO macro/addin trust decision based on mutable document metadata | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
76
+ | `INS-054` | `[DllImport]` без абсолютного пути к нативной DLL — риск DLL search order hijacking (CW... | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
77
+ | `INS-055` | Логирование полного пути `Environment.GetFolderPath` без маскировки — утечка профиля по... | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
78
+ | `INS-056` | `LoadLibrary` из пользовательского/Temp пути без проверки подписи (CWE-427) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
79
+ | `INS-057` | `Assembly.LoadFile` из Downloads без верификации (CWE-427) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
80
+ | `INS-058` | WPF `TextBlock` с полным системным путём пользователя (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
81
+ | `INS-059` | WinForms `MessageBox` с полным путём профиля (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
82
+ | `INS-060` | `OpenFileDialog` результат в заголовке окна без маскировки (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
83
+ | `INS-061` | `DllImport` с поиском в `%TEMP%` (CWE-427) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
84
+ | `INS-062` | Отображение `Assembly.Location` пользователю в UI (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
85
+ | `INS-063` | Electron `dialog.showOpenDialog` path в `document.title` (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
86
+ | `INS-064` | NativeLibrary.Load из relative path в add-in (CWE-427) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
87
+ | `INS-065` | `ToolStripStatusLabel` с полным путём к roaming app data (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
88
+ | `INS-066` | TOCTOU: `File.Exists` затем `File.OpenRead` без атомарной блокировки (CWE-367) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
89
+ | `INS-067` | `DllImport` без абсолютного пути к нативной DLL в каталоге аддина (CWE-427) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
90
+ | `INS-068` | Небезопасный `File.Open` без `FileShare`/`FileOptions` при конкурирующей записи (CWE-367) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
91
+ | `INS-069` | Неверный размер буфера `stackalloc` для interop (CWE-131) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
92
+ | `INS-070` | VSTO: логирование полного набора переменных окружения (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
93
+ | `INS-071` | VSTO: вывод `Environment.GetCommandLineArgs()` в telemetry (CWE-497) | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. |
94
+ | `INS-072` | Insight: xlsx (SheetJS 0.18.5) cell from user written without formula neutralization | Prefix formula-meta chars in .xlsx exports; central `sanitizeForExcelCell()` for all user/DB fields. |
95
+ | `INS-073` | Insight: `XLSX.utils.json_to_sheet` from untrusted rows без санитизации | Map all values through sanitize before `json_to_sheet` / `aoa_to_sheet`. |
96
+ | `INS-074` | Insight: `xlsx.writeFile` экспорт без нейтрализации формул в колонках | Never write raw user strings to xlsx cells; apply CSV/Excel injection defenses. |
97
+ | `INS-075` | Insight: `xlsx` read → re-export цепочка без ре-sanitization | On re-export pipeline, treat every cell as untrusted input. |
98
+ | `INS-076` | Insight: mammoth `convertToHtml` без ограничения размера входного DOCX | Enforce max doc size before mammoth; reject oversized ZIP/docx. |
99
+ | `INS-077` | Insight: mammoth извлечение без hardening XML внутри DOCX (внешние сущности) | Pre-validate docx zip and XML parts; disable entity expansion in XML pipeline. |
100
+ | `INS-078` | Insight: `docx` npm / PizZip открытие без проверки compression ratio (zip bomb) | Enforce max uncompressed size and compression ratio for OOXML containers. |
101
+ | `INS-079` | Insight: `JSZip` загрузка `.docx/.pptx` без лимита распакованного объёма | Track cumulative uncompressed bytes; abort on threshold (zip bomb). |
102
+ | `INS-080` | Insight: `pdfjs-dist` `getDocument` без лимита на размер/страницы | Cap PDF bytes and pages; stream with limits. |
103
+ | `INS-081` | Insight: `pdfjs-dist` workerSrc с недоверенного origin | Host pdf.worker.js from same origin; integrity attribute. |
104
+ | `INS-082` | Insight: `word-extractor` без таймаута и лимита памяти | Timeout + size limit around word-extractor; reject huge binaries. |
105
+ | `INS-083` | Insight: `docx` XML part `word/document.xml` парсится с `xml2js` `mergeAttrs` без отклю... | Parse OOXML with XXE-safe XML settings; no external entities. |
106
+ | `INS-084` | Insight: ExcelJS `worksheet.addRow` с пользовательскими строками в отчёт | Sanitize ExcelJS rows before commit; same rules as SheetJS. |
107
+ | `INS-085` | Insight: `mammoth` `convertToHtml` + встроенные `styleMap` из пользователя | Do not pass user-controlled styleMap to mammoth; allowlist only. |
108
+ | `INS-086` | Insight: распаковка `.pptx` для превью без ratio check | Same zip-bomb defenses as docx for pptx OOXML. |
109
+ | `INS-087` | Insight: `fflate` unzip `xlsx` array без лимита | Limit entries and total bytes when using fflate/unzip on xlsx. |
110
+ | `INS-088` | Insight: `pdfjs` `getMetadata` доверие к `/Title` для XSS в UI | Treat PDF metadata as untrusted; never HTML-embed without encode. |
111
+ | `INS-089` | Insight: mammoth `embedImage` с пользовательским base64 | Strict allowlist for embedded image resolution in mammoth. |
112
+ | `INS-090` | Insight: CSV → xlsx pipeline без нейтрализации (формула в CSV) | Apply CSV injection rules before promoting to xlsx. |
113
+ | `INS-091` | Insight: `word-extractor` + последующая запись в HTML без escape | Never assign extracted text to innerHTML without sanitization. |
114
+ | `INS-092` | OpenAI SDK: `chat.completions.create` без схемы ответа для JSON-логики | Use `json_schema` response_format or validate with Zod before branching logic. |
115
+ | `INS-093` | OpenAI: доверие к `role`/`tool_calls` без проверки | Never branch security on model-supplied role strings; server-side allowlist. |
116
+ | `INS-094` | OpenAI: `completion.choices[0].message.content` как команда без allowlist | Validate structured output; reject unknown fields; no shell exec from model text. |
117
+ | `INS-095` | OpenAI: streaming chunks собраны в объект без финальной Zod-проверки | Finalize streamed LLM output with schema validation. |
118
+ | `INS-096` | OpenAI: `tools`/`function` arguments без типизации | Per-tool Zod schema for JSON arguments from OpenAI. |
119
+ | `INS-097` | OpenAI: `system` + `developer` messages логируются через `electron-log` | Redact system/developer prompts from electron-log; structured logging without secrets. |
120
+ | `INS-098` | OpenAI: system prompt в `console.log` / renderer DevTools | Ban console logging of system prompts outside sealed dev diagnostics. |
121
+ | `INS-099` | OpenAI: ответ модели напрямую в `ipcRenderer.send` без валидации | Validate OpenAI payloads before IPC; duplicate validation in main. |
122
+ | `INS-100` | Electron 36: `BrowserWindow` без явного `nodeIntegration: false` | Always set `nodeIntegration: false` and `contextIsolation: true` explicitly in main. |
123
+ | `INS-101` | Electron: `webPreferences` без `contextIsolation: true` | Explicit `contextIsolation: true` for every BrowserWindow. |
124
+ | `INS-102` | Electron: `ipcMain.handle` без проверки `event.senderFrame` | Validate `event.senderFrame` / sender URL before handling IPC. |
125
+ | `INS-103` | Electron: `ipcMain.handle` доверяет `event.sender` без `frame` | Pair IPC handlers with sender frame / origin checks. |
126
+ | `INS-104` | Electron: удалённый `preload` path из конфига пользователя | Never load preload from user-controlled paths; allowlist under app package. |
127
+ | `INS-105` | Electron: `webPreferences.webSecurity: false` | Keep `webSecurity: true` except rare dev-only exceptions. |
128
+ | `INS-106` | Electron: `ipcMain.handle` + `shell.openExternal` с аргументом от renderer | Validate URLs before `openExternal` from IPC payloads. |
129
+ | `INS-107` | Electron: merge `defaultWebPreferences` из `userData` JSON | Immutable hardened webPreferences; ignore user overrides for security keys. |
130
+ | `INS-108` | Electron: `session.setPermissionRequestHandler` всегда `cb(true)` | Default deny; explicit allowlist for media/geolocation. |
131
+ | `INS-109` | Electron: `protocol.registerFileProtocol` без path traversal check | Validate file paths in custom protocols; prevent traversal. |
132
+ | `INS-110` | Electron: `desktopCapturer` + AI без user consent | Gate screen capture behind explicit user consent. |
133
+ | `INS-111` | Insight: `xlsx` `sheet_to_csv` затем email без escape | Sanitize CSV exports from xlsx before messaging. |
134
+ | `INS-112` | Insight: `mammoth` `convertToHtml` + `innerHTML` в Electron | Sanitize mammoth HTML before DOM insertion. |
135
+ | `INS-113` | Insight: `pdfjs` page text → SQL без параметризации | Parameterize DB; treat PDF text as untrusted. |
136
+ | `INS-114` | Insight: `docx` template engine `{{user}}` без escape | Escape template fields for docx generation. |
137
+ | `INS-115` | Insight: OpenAI `responses.parse` / structured output без `strict: true` | Use strict JSON schema where API allows. |
138
+ | `INS-116` | OpenAI: логирование полного `messages` в `pino`/`winston` | Redact OpenAI message bodies in logs. |
139
+ | `INS-117` | Electron: `contextBridge.exposeInMainWorld` с функцией без аргументов проверки | Validate IPC args in preload bridge and main. |
140
+ | `INS-118` | Electron: `ipcMain.on` (legacy) вместо `handle` без проверки sender | Prefer `handle` with sender validation over legacy `on`. |
141
+ | `INS-119` | Insight: `pdfjs` `getDocument` data URL с user data | Block unbounded base64 PDF from user input. |
142
+ | `INS-120` | Insight: `word-extractor` на UNC path без доверия | Restrict UNC/network paths for extraction. |
143
+ | `INS-121` | Insight: xlsx `cellStyles` из пользователя | Do not apply user-controlled styles that embed formulas. |
144
+ | `INS-122` | Insight: mammoth `convertToMarkdown` → markdown XSS | Sanitize markdown output from mammoth. |
145
+ | `INS-123` | Insight: `docx` hyperlink из пользователя | Validate hyperlinks in generated docx. |
146
+ | `INS-124` | OpenAI: `parallel_tool_calls` без лимита веток | Limit parallel tool execution from model. |
147
+ | `INS-125` | OpenAI: кэш ответа LLM на диск без шифрования | Encrypt cached LLM responses; no plaintext PII. |
148
+ | `INS-126` | Electron: `nativeImage` из пользовательского пути без проверки | Validate paths for nativeImage loads. |
149
+ | `INS-127` | Electron: `Menu` item `click` с `remote` shell | Validate URLs in menu handlers. |
150
+ | `INS-128` | Insight: `xlsx` shared strings table pollution | Sanitize shared strings when merging workbooks. |
151
+ | `INS-129` | Insight: `pptxgenjs` text from user без sanitize | Sanitize user text in pptxgenjs slides. |
152
+ | `INS-130` | Insight: `pdf-lib` embed font from user path | Restrict embedded fonts to trusted sources. |
153
+ | `INS-131` | OpenAI: `temperature`/`top_p` max для production | Bound sampling params for production AI paths. |
154
+ | `INS-132` | OpenAI: отсутствие `seed` для воспроизводимости аудита | Use seed for reproducibility when policy requires. |
155
+ | `INS-133` | Electron: `powerMonitor` + IPC без auth | Gate system events on IPC. |
156
+ | `INS-134` | Electron: `clipboard` write из renderer без проверки | Mediate clipboard IPC in main. |
157
+ | `INS-135` | Insight: `mammoth` + `cheerio` load без sanitize | Sanitize cheerio HTML from mammoth. |
158
+ | `INS-136` | Insight: `xlsx` password-protected workbook без rate limit | Rate-limit xlsx password attempts. |
159
+ | `INS-137` | Insight: `pdfjs` `getOperatorList` утечка в лог | Do not log PDF operator lists in production. |
160
+ | `INS-138` | OpenAI: `metadata` поля с PII в `store` | Minimize OpenAI request metadata. |
161
+ | `INS-139` | Electron: `globalShortcut` регистрация без проверки фокуса | Validate focus before global shortcuts. |
162
+ | `INS-140` | Electron: `dialog.showSaveDialog` path в `openExternal` | Validate save dialog paths before opening. |
163
+ | `INS-141` | Insight: `xlsx` CSV delimiter injection | Handle CSV delimiter injection in xlsx roundtrip. |
164
+ | `INS-142` | Insight: `docx` `header`/`footer` user HTML | Safe XML/HTML for headers/footers. |
165
+ | `INS-143` | Insight: `pdfjs` `getAnnotations` исполнение | Treat PDF annotations as untrusted. |
166
+ | `INS-144` | OpenAI: `response_format` JSON + `tools` одновременно без тестов | Test tools + JSON schema together. |
167
+ | `INS-145` | Electron: `BrowserView` без `webPreferences` копии | Set full webPreferences on BrowserView. |
168
+ | `INS-146` | Electron: `utilityProcess` fork без argv allowlist | Validate utility process arguments. |
169
+ | `INS-147` | Insight: `mammoth` `ignoreEmptyParagraphs: false` + huge doc | Combine mammoth options with size caps. |
170
+ | `INS-148` | Insight: `xlsx` `sheet_to_json` `defval` user injection | Do not use user input as defval in sheet_to_json. |
171
+ | `INS-149` | OpenAI: `max_tokens` не ограничен для UI path | Bound max_tokens for interactive flows. |
172
+ | `INS-150` | Electron: `safeStorage` key fallback | No plaintext fallback when safeStorage unavailable. |
173
+ | `INS-151` | Insight: Infinity release checklist — отсутствие `npm audit` в CI для Insight deps | Run npm audit in CI for Insight stack. |
174
+ | `INS-152` | Insight: `electron` `remote` module (deprecated) | Ban `@electron/remote`; use contextBridge. |
175
+
176
+ ## Verification
177
+
178
+ **Verification:** Check the gold testbed file(s) below for `Vulnerable: <ID>` markers (static Semgrep + `detection-matrix.md` ground truth).
179
+
180
+ - [`gold-standard-testbed/insight_vulnerable.ts`](../gold-standard-testbed/insight_vulnerable.ts)
181
+ - [`gold-standard-testbed/insight_vulnerable.cs`](../gold-standard-testbed/insight_vulnerable.cs)
182
+
183
+ After changing [`patterns.md`](patterns.md), run from the repo root:
184
+
185
+ ```bash
186
+ python scripts/sync_semgrep.py
187
+ ```
188
+
189
+ ## Workflow: Recon → Scan → Verify
190
+
191
+ ### 1) Recon
192
+ - Map entrypoints, data flows, and trust boundaries for this stack.
193
+ - Identify which metrics in [`patterns.md`](patterns.md) apply to the code under review.
194
+
195
+ ### 2) Scan
196
+ - Run Semgrep with `semgrep-rules/<skill>.yaml` (generated) and correlate with Anti-Patterns.
197
+ - Eliminate findings that cannot bind to a metric row.
198
+
199
+ ### 3) Verify
200
+ - Confirm markers or scanner hits for touched IDs in the gold testbed when adding metrics.
201
+ - Emit findings as `Vulnerable: <PREFIX>-<NNN>` in written reviews.
202
+
@@ -0,0 +1,154 @@
1
+ | ID | Название метрики | Anti-Pattern (Vulnerable Code/YAML) | Safe-Pattern (Remediation) | Stack | Источник fix_template | Exploit scenario |
2
+ |---|---|---|---|---|---|---|
3
+ | INS-001 | Electron Insecure Content Isolation | `webPreferences: { contextIsolation: false }` | `contextIsolation: true` + `preload` скрипт без прямого `nodeIntegration` в рендере | Electron/Desktop/.NET | `CWE-94` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-001 electron insecure content isolation webpreferences contextisolation false true preload скрипт без прямого nodeintegration в рендере -->
4
+ | INS-002 | Electron Node Integration Leak | `webPreferences: { nodeIntegration: true }` | `nodeIntegration: false` для окон с внешним/непроверенным контентом | Electron/Desktop/.NET | `CWE-200` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-002 electron node integration leak webpreferences nodeintegration true false для окон с внешним непроверенным контентом -->
5
+ | INS-003 | Electron Insecure IPC | `ipcMain.on('data', (event, arg) => eval(arg))` | `ipcMain.handle` + схема валидации (zod/io-ts) + запрет `eval`/`new Function` | Electron/Desktop/.NET | `CWE-749` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-003 electron insecure ipc ipcmain on data event arg eval handle схема валидации zod io ts запрет new function -->
6
+ | INS-004 | .NET 4.8 / VSTO Legacy Deserialization | `new BinaryFormatter().Deserialize(stream)` | `JsonConvert.DeserializeObject<T>(...)` с известными типами или `DataContractSerializer` с allowlist | Electron/Desktop/.NET | `CWE-502` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-004 net 4 8 vsto legacy deserialization new binaryformatter deserialize stream jsonconvert deserializeobject t с известными типами или datacontractserializer allowlist -->
7
+ | INS-005 | VSTO Insecure XML | `var doc = new XmlDocument();`<br>`doc.Load(stream);` | `settings.DtdProcessing = DtdProcessing.Prohibit;` + `XmlReader.Create` с `XmlReaderSettings` | Electron/Desktop/.NET | `CWE-611` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-005 vsto insecure xml var doc new xmldocument load stream settings dtdprocessing prohibit xmlreader create с xmlreadersettings -->
8
+ | INS-006 | NSIS DLL Hijacking | `!include "MUI2.nsh"` | `!insertmacro SetDefaultDllDirectories` в начале скрипта (до секций с `File`) | Electron/Desktop/.NET | `CWE-427` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-006 nsis dll hijacking include mui2 nsh insertmacro setdefaultdlldirectories в начале скрипта до секций с file -->
9
+ | INS-007 | VSTO Cleartext Password in Config | `connectionString="Server=.;User ID=sa;Password=secret123"` | `ProtectedData.Protect` / DPAPI / Azure Key Vault / секреты вне `app.config` | Electron/Desktop/.NET | `CWE-312` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-007 vsto cleartext password config connectionstring server user id sa secret123 protecteddata protect dpapi azure key vault секреты вне app -->
10
+ | INS-008 | Electron Production Debugging | `mainWindow.webContents.openDevTools()` | `if (isDev) { mainWindow.webContents.openDevTools(); }` | Electron/Desktop/.NET | `CWE-489` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-008 electron production debugging mainwindow webcontents opendevtools if isdev -->
11
+ | INS-009 | Unsafe .NET deserialization in desktop stack (BinaryFormatter/JavaScriptSerializer/XmlSerializer) | `new BinaryFormatter().Deserialize(stream)`<br>`new JavaScriptSerializer().Deserialize<T>(data)`<br>`new XmlSerializer(type).Deserialize(untrustedStream)` | Запретить небезопасную десериализацию недоверенных данных; использовать безопасные сериализаторы, strict type allowlist и schema validation. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
12
+ | INS-010 | Dynamic assembly/type loading from untrusted concatenated input | `Assembly.LoadFrom(basePath + userInput)`<br>`Type.GetType("Plugin." + userType)` | Исключить динамическую загрузку по внешнему вводу; использовать жесткий allowlist типов/сборок и проверку подписи assembly. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
13
+ | INS-011 | Unsafe native library loading without secure search path controls | `[DllImport("mylib.dll")]`<br>`LoadLibrary(userPath)` без `LOAD_LIBRARY_SEARCH_SYSTEM32`/absolute path | Использовать абсолютные пути/`LOAD_LIBRARY_SEARCH_SYSTEM32`, исключить загрузку DLL из текущей директории и пользовательских путей. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
14
+ | INS-012 | XXE risk: XmlDocument/XmlTextReader without `XmlResolver = null` | `var doc = new XmlDocument(); doc.Load(xml);`<br>`new XmlTextReader(stream)` | Явно отключать `XmlResolver` (`null`) и DTD processing, использовать `XmlReaderSettings` с безопасными флагами. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
15
+ | INS-013 | Weak cryptography in .NET (`MD5`, `SHA1Managed`, `DESCryptoServiceProvider`) | `MD5.Create()`<br>`new SHA1Managed()`<br>`new DESCryptoServiceProvider()` | Использовать современные криптопримитивы (`SHA256`/`SHA512`, `Aes`), запретить MD5/SHA1/DES в security-critical коде. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
16
+ | INS-014 | TOCTOU file race (`Check then Open`) in `System.IO` | `if (File.Exists(path)) { using var fs = File.Open(path, ...); }` | Избегать check-then-open: открывать файл атомарно, использовать безопасные флаги доступа/блокировки и проверку после открытия. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
17
+ | INS-015 | Unsafe impersonation lifecycle: `WindowsIdentity.Impersonate()` without guaranteed `Undo()` in `finally` | `var ctx = WindowsIdentity.Impersonate(token);` (без `finally { ctx.Undo(); }`) | Всегда завершать impersonation в `finally`, использовать минимальный scope привилегий и обязательный rollback контекста. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
18
+ | INS-016 | Unsafe memory operations: `stackalloc`/pointer arithmetic without bounds checks | `byte* p = stackalloc byte[len]; p[i + offset] = value;` | Для unsafe-кода вводить явные bounds checks, использовать безопасные Span/Memory API и минимизировать pointer arithmetic. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
19
+ | INS-017 | Integer overflow risk in buffer/array size calculations outside `checked` blocks | `int size = count * elementSize; var buf = new byte[size];` | Критичную арифметику размеров выполнять в `checked` блоках и валидировать диапазоны перед выделением памяти. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
20
+ | INS-018 | Resource lifecycle leak: missing `Dispose`/`using` for `SafeHandle`, `AutoResetEvent`, `FileStream` | `var fs = new FileStream(...);`<br>`var ev = new AutoResetEvent(false);` (без using/dispose) | Для unmanaged/resource-heavy объектов всегда использовать `using`/`await using` или гарантированный `Dispose()` в `finally`. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
21
+ | INS-019 | Registry operation driven by untrusted key/value input | `Registry.SetValue(userKey, name, userValue)`<br>`RegistryKey.OpenSubKey(userPath)` | Не использовать внешние данные как путь/ключ реестра напрямую; применять allowlist для веток/имен и strict validation значений. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
22
+ | INS-020 | Dangerous locking primitives (`lock(this)`, `lock(typeof(...))`, `lock("string")`) | `lock(this)`<br>`lock(typeof(Service))`<br>`lock("global")` | Использовать приватный неизменяемый объект синхронизации: `private readonly object _lock = new object();`. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
23
+ | INS-021 | Unmanaged memory allocation without guaranteed `FreeHGlobal` in `finally` | `var p = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(obj, p, false);` (без `FreeHGlobal`) | Всегда освобождать unmanaged memory в `finally`, использовать SafeHandle/critical-finalizer patterns для надежного cleanup. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
24
+ | INS-022 | IPC object without explicit security descriptor (`PipeSecurity`/`MutexSecurity`) | `new NamedPipeServerStream("pipe")`<br>`new Mutex(false, "Global\\Name")` | Явно задавать `PipeSecurity`/`MutexSecurity` с ограниченным ACL и минимально необходимыми правами доступа. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
25
+ | INS-023 | Untrusted pipe name construction via string concatenation | `var pipe = "svc_" + userInput; new NamedPipeServerStream(pipe)` | Не формировать IPC-имена из внешнего ввода; использовать фиксированные/allowlist значения и strict validation формата. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
26
+ | INS-024 | Unsafe handle passing to extern methods without trust validation | `NativeCall(control.Handle)`<br>`NativeCall(proc.Handle)` | Перед передачей handle во внешние вызовы проверять доверенность целевой стороны, жизненный цикл handle и ограничивать interop surface. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
27
+ | INS-025 | Dangerous native interop functions imported via `[DllImport]` (`strcpy`, `strcat`, `gets`) | `[DllImport("msvcrt.dll")] static extern IntPtr strcpy(...)` | Запретить небезопасные C runtime функции, использовать secure аналоги (`strcpy_s`/`strcat_s`) и безопасные managed API. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
28
+ | INS-026 | Reflection-based instance creation from untrusted type names | `Activator.CreateInstance(null, typeName)`<br>`AppDomain.CreateInstance(..., typeName)` | Не использовать внешние строки как type/assembly identifiers; применять строгий allowlist типов и проверку происхождения сборки. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
29
+ | INS-027 | Sensitive secrets stored in immutable `string` objects in memory | `string apiKey = "..."`<br>`string password = input` | Для секретов использовать `SecureString`/защищенные буферы, минимизировать lifetime и очищать память после использования. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
30
+ | INS-028 | Exception swallowing: empty `catch { }` without logging or rethrow | `try { ... } catch { }` | Исключения не глотать: логировать контекст и/или пробрасывать (`throw`), применять fail-closed обработку ошибок. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
31
+ | INS-029 | Unchecked WinAPI return codes (`BOOL`/`HRESULT`) from `[DllImport]` calls | `if (!NativeCall(...))` отсутствует проверка<br>`HRESULT` игнорируется | После interop-вызовов обязательно проверять return code, обрабатывать ошибки и прерывать выполнение при неуспехе. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
32
+ | INS-030 | COM object lifecycle leak: missing `Marshal.ReleaseComObject()` in `try/finally` | `var app = new Microsoft.Office.Interop...` без release в finally | Для COM-объектов использовать `try/finally` с гарантированным `Marshal.ReleaseComObject()` и корректным порядком освобождения. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
33
+ | INS-031 | Hardcoded cryptographic keys in `AesManaged` / `RSACryptoServiceProvider` initialization | `static readonly byte[] Key = {...}; aes.Key = Key;` | Исключить hardcoded keys: получать ключи из защищенного хранилища (DPAPI/Key Vault), ротация и контроль жизненного цикла ключей. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
34
+ | INS-032 | Insecure random generation for crypto material using `System.Random` | `var rnd = new Random();` для IV/паролей/токенов | Для криптографических целей использовать `RandomNumberGenerator.Create()` / `RNGCryptoServiceProvider`, не применять `System.Random`. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
35
+ | INS-033 | Weak RSA key size (<2048 bits) | `new RSACryptoServiceProvider(1024)` | Использовать RSA 2048+ (предпочтительно 3072+), enforce key policy при генерации/загрузке ключей. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
36
+ | INS-034 | Hardcoded `AesManaged` Key/IV byte arrays in code | `var aes = new AesManaged { Key = keyBytes, IV = ivBytes };` где `keyBytes/ivBytes` заданы как static literals | Ключи/IV получать из защищенного KMS/DPAPI и генерировать IV криптографически стойко для каждой операции, исключить literals в коде. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
37
+ | INS-035 | `System.Random` used for auth token or cryptographic salt generation | `new Random().Next(...)` для auth token / salt / reset code | Для token/salt использовать `RandomNumberGenerator.Fill(...)` или `RandomNumberGenerator.GetBytes(...)`, исключить предсказуемый PRNG. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
38
+ | INS-036 | Unsafe dynamic JSON deserialization: `JsonConvert.DeserializeObject<dynamic>(...)` without schema/type validation | `dynamic obj = JsonConvert.DeserializeObject<dynamic>(input)` и последующий direct access | Десериализовывать в строгие DTO-модели и валидировать типы/диапазоны до бизнес-логики, отклонять лишние поля. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
39
+ | INS-037 | `XmlDocument.LoadXml()` without DTD/entities hardening | `var xml = new XmlDocument(); xml.LoadXml(untrusted)` без `XmlResolver = null` и запрета DTD | Использовать безопасные `XmlReaderSettings` (`DtdProcessing = Prohibit`, `XmlResolver = null`) и парсить через `XmlReader`. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
40
+ | INS-038 | `WebBrowser.Navigate(userUrl)` without strict protocol allowlist (https only) | `webBrowser.Navigate(userInputUrl)` без `Uri.TryCreate` и `uri.Scheme == Uri.UriSchemeHttps` | Перед навигацией выполнять строгую URI-валидацию и allowlist схем/хостов, блокировать `http`, `file`, `javascript` и другие опасные схемы. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
41
+ | INS-039 | Debug-only bypass methods disable SSL/license checks via `[Conditional("DEBUG")]` | `[Conditional("DEBUG")] void DisableSslValidation(){...}`<br>`[Conditional("DEBUG")] void BypassLicense(){...}` | Не добавлять debug hooks, изменяющие security-critical поведение; TLS/лицензирование должны быть неизменными во всех сборках. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
42
+ | INS-040 | Accessing `Globals.ThisAddIn.Application` from background thread without marshaling/invoke | `Task.Run(() => Globals.ThisAddIn.Application.ActiveDocument...)` | COM Office-объекты вызывать только из UI/STA потока через корректный marshaling (`SynchronizationContext`/`Control.Invoke`). | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
43
+ | INS-041 | Missing Electron CSP `frame-ancestors 'none'` in main process response headers (CWE-1021) | В main process не задан CSP или CSP без `frame-ancestors 'none'` | Для Electron-окон задавать строгий CSP в заголовках (`default-src 'self'; frame-ancestors 'none'`) и блокировать clickjacking embedding. | Electron/Desktop/.NET | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
44
+ | INS-042 | Incorrect native buffer size for marshaling fixed structs (CWE-131) | `var p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)))` для структуры большего размера | Выделять память строго по `Marshal.SizeOf<T>()` целевой структуры и валидировать длины входных буферов перед копированием. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
45
+ | INS-043 | Off-by-one allocation for UTF-16 interop strings (CWE-131) | `Marshal.AllocHGlobal(input.Length)` для wide-char строк | Учитывать null-terminator и размер символа (`(len + 1) * 2`), использовать `Marshal.StringToHGlobalUni` при возможности. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
46
+ | INS-044 | `StructureToPtr` writes larger structure into undersized unmanaged buffer (CWE-131) | `AllocHGlobal(16); Marshal.StructureToPtr(largeStruct, ptr, false)` | Проверять соответствие allocated size размеру структуры до marshal-операций; применять safe wrappers с size assertions. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
47
+ | INS-045 | `Marshal.Copy` length driven by untrusted value without bounds check (CWE-131) | `Marshal.Copy(src, 0, ptr, userLen)` | Ограничивать длину копирования по фактическому размеру буфера и использовать checked arithmetic для size calculations. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
48
+ | INS-046 | Detailed debug message disclosure in production logs/UI (CWE-1295) | `logger.Error(ex.ToString())`<br>`MessageBox.Show(ex.ToString())` в production path | В production отдавать/логировать sanitized error codes, полный stack trace хранить только в restricted debug pipeline. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
49
+ | INS-047 | Electron main process logs verbose Chromium crash/debug details in production (CWE-1295) | `app.commandLine.appendSwitch("enable-logging", "stderr")` + export raw crash details | В production отключать verbose debug switches, включать structured redacted logging без internal stack/paths. | Electron/Desktop/.NET | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
50
+ | INS-048 | Electron `webContents` permission handler allows all requests | `session.setPermissionRequestHandler((_wc,_perm,cb)=>cb(true))` | Реализовать explicit permission allowlist и deny-by-default для media/notifications/openExternal permissions. | Electron/Desktop/.NET | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
51
+ | INS-049 | Unsafe `shell.openExternal` with unvalidated URL schemes | `shell.openExternal(userUrl)` | Валидировать URL через allowlist схем/доменов (`https` only), блокировать `file:`, `javascript:`, custom dangerous schemes. | Electron/Desktop/.NET | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
52
+ | INS-050 | Disabled Electron process sandbox in production window config | `new BrowserWindow({ webPreferences: { sandbox: false } })` | Включать `sandbox: true` и минимизировать bridge через preload с контекстной изоляцией. | Electron/Desktop/.NET | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
53
+ | INS-051 | Broad IPC surface: generic channels without argument schema validation | `ipcMain.handle("cmd", (_e,args)=>run(args))` | Для каждого IPC-channel использовать строгую схему аргументов и отдельные handlers с allowlist actions. | Electron/Desktop/.NET | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
54
+ | INS-052 | Unverified auto-update feed/signature in desktop updater | `autoUpdater.setFeedURL(userControlledUrl)` | Фиксировать trusted update endpoint, проверять подпись/issuer обновлений и enforce TLS pinning/update integrity. | Electron/Desktop/.NET | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
55
+ | INS-053 | VSTO macro/addin trust decision based on mutable document metadata | `if(doc.BuiltInDocumentProperties["Company"]=="Trusted"){LoadPlugin();}` | Применять криптографическую проверку подписи и trusted publisher chain вместо metadata-based trust decisions. | C#/.NET 4.8 Desktop | CWE Final Certification | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. |
56
+ | INS-054 | `[DllImport]` без абсолютного пути к нативной DLL — риск DLL search order hijacking (CWE-427) | `[DllImport("contoso_helper.dll")]`<br>`[DllImport(@"plugins\myext.dll")]` | Загрузка только из доверенного абсолютного пути; `SetDllDirectory`/`LOAD_LIBRARY_SEARCH_SYSTEM32`; подпись/хэш бинарника. | C#/.NET 4.8 Desktop | `CWE-427` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-054 dllimport contoso helper dll plugins myext dll без абсолютного пути -->
57
+ | INS-055 | Логирование полного пути `Environment.GetFolderPath` без маскировки — утечка профиля пользователя (CWE-497) | `Log.Info(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))`<br>`logger.Debug($"Local={Environment.GetFolderPath(SpecialFolder.LocalApplicationData)}")` | Логировать признак/хэш пути или redact; не выводить полный путь в shared telemetry. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-055 log info environment getfolderpath applicationdata localapplicationdata без маскировки -->
58
+ | INS-056 | `LoadLibrary` из пользовательского/Temp пути без проверки подписи (CWE-427) | `LoadLibrary(Path.Combine(Path.GetTempPath(), userDll))` | Загрузка только из Program Files / подписанные DLL; `SetDllDirectory(null)`. | C#/.NET 4.8 Desktop | `CWE-427` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-056 loadlibrary path combine gettemppath userdll guardian -->
59
+ | INS-057 | `Assembly.LoadFile` из Downloads без верификации (CWE-427) | `Assembly.LoadFile(Path.Combine(Environment.GetFolderPath(SpecialFolder.UserProfile), "Downloads\\ext.dll"))` | Allowlist путей + publisher signature check. | C#/.NET 4.8 Desktop | `CWE-427` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-057 assembly loadfile downloads ext dll guardian -->
60
+ | INS-058 | WPF `TextBlock` с полным системным путём пользователя (CWE-497) | `pathText.Text = Environment.GetFolderPath(SpecialFolder.Desktop)` | Показывать только имя папки или маскированный путь. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-058 wpf textblock getfolderpath desktop full path guardian -->
61
+ | INS-059 | WinForms `MessageBox` с полным путём профиля (CWE-497) | `MessageBox.Show(Environment.GetFolderPath(SpecialFolder.Personal))` | UX без раскрытия полного пути; логировать отдельно с redaction. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-059 messagebox show getfolderpath personal guardian -->
62
+ | INS-060 | `OpenFileDialog` результат в заголовке окна без маскировки (CWE-497) | `this.Text = dlg.FileName` | Показывать только `Path.GetFileName`; не полный UNC/path. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-060 openfiledialog filename text window title guardian -->
63
+ | INS-061 | `DllImport` с поиском в `%TEMP%` (CWE-427) | `[DllImport("kernel32", SetLastError=true)]` + `SetDllDirectory(Path.GetTempPath())` | Не менять DLL search на temp; использовать абсолютные пути. | C#/.NET 4.8 Desktop | `CWE-427` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-061 setdlldirectory gettemppath kernel32 guardian -->
64
+ | INS-062 | Отображение `Assembly.Location` пользователю в UI (CWE-497) | `lblPath.Text = Assembly.GetExecutingAssembly().Location` | Скрыть полный путь; показывать version/product only. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-062 label assembly getexecutingassembly location guardian -->
65
+ | INS-063 | Electron `dialog.showOpenDialog` path в `document.title` (CWE-497) | `win.setTitle(filePaths[0])` | Mask path в title; basename only. | Electron/Desktop/.NET | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-063 electron settitle filepaths basename guardian -->
66
+ | INS-064 | NativeLibrary.Load из relative path в add-in (CWE-427) | `NativeLibrary.Load("plugins\\native.dll")` | Абсолютный путь + проверка подписи нативной библиотеки. | C#/.NET 4.8 Desktop | `CWE-427` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-064 nativelibrary load plugins native dll guardian -->
67
+ | INS-065 | `ToolStripStatusLabel` с полным путём к roaming app data (CWE-497) | `statusLabel.Text = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)` | Маскировать; статус без PII path. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-065 toolstripstatuslabel getfolderpath applicationdata guardian -->
68
+ | INS-066 | TOCTOU: `File.Exists` затем `File.OpenRead` без атомарной блокировки (CWE-367) | `if (File.Exists(path)) { using var s = File.OpenRead(path); }` | Открывать файл напрямую с ожидаемым `FileShare`/`FileMode`; использовать OS-level locks или транзакционный доступ. | C#/.NET 4.8 Desktop | `CWE-367` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-066 file exists openread toctou cwe367 guardian -->
69
+ | INS-067 | `DllImport` без абсолютного пути к нативной DLL в каталоге аддина (CWE-427) | `[DllImport("contoso_native.dll", CallingConvention = CallingConvention.Cdecl)]` без `LoadLibrary` из `Path.Combine(AppContext.BaseDirectory, "native", "contoso_native.dll")` | Явный абсолютный путь + `SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)`; запрет загрузки из CWD. | C#/.NET 4.8 Desktop | `CWE-427` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-067 dllimport contoso native dll без абсолютного пути guardian -->
70
+ | INS-068 | Небезопасный `File.Open` без `FileShare`/`FileOptions` при конкурирующей записи (CWE-367) | `File.Open(path, FileMode.Open, FileAccess.ReadWrite)` без `FileShare.Read`/`Delete` policy | Задавать минимальный `FileShare`, при необходимости `FileStream` с `FileOptions.Asynchronous` и retry на sharing violation. | C#/.NET 4.8 Desktop | `CWE-367` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-068 file open readwrite без fileshare конкуренция guardian -->
71
+ | INS-069 | Неверный размер буфера `stackalloc` для interop (CWE-131) | `Span<byte> buf = stackalloc byte[userLen];` без `checked` и верхней границы | Валидировать `userLen`, использовать `checked` арифметику и фиксированные max limits до `stackalloc`. | C#/.NET 4.8 Desktop | `CWE-131` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-069 stackalloc userlen без checked cwe131 guardian -->
72
+ | INS-070 | VSTO: логирование полного набора переменных окружения (CWE-497) | `Log.Debug(Environment.GetEnvironmentVariables().ToString())` | Redact env keys (`PATH`, `USERPROFILE`, secrets); логировать только факт наличия профиля/роли. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-070 log debug environment getenvironmentvariables vsto guardian -->
73
+ | INS-071 | VSTO: вывод `Environment.GetCommandLineArgs()` в telemetry (CWE-497) | `TelemetryClient.TrackTrace(string.Join(" ", Environment.GetCommandLineArgs()))` | Маскировать аргументы; не отправлять полную командную строку в shared sinks. | C#/.NET 4.8 Desktop | `CWE-497` | Use using/try-finally and safe .NET APIs; enforce strict allowlists for untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-071 telemetry tracktrace getcommandlineargs guardian -->
74
+ | INS-072 | Insight: xlsx (SheetJS 0.18.5) cell from user written without formula neutralization | `ws['A1'] = userCell`<br>без префикса `'` и без strip `=+-@` | `function sanitizeXlsxCell(v){...}` префикс `'` для `^[\\+\\-=\\t\\r\\@]`; `XLSX.utils.sheet_add_aoa` с map. | Insight/Node/xlsx | `CWE-1236` | Prefix formula-meta chars in .xlsx exports; central `sanitizeForExcelCell()` for all user/DB fields. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-072 insight xlsx sheetjs cell injection -->
75
+ | INS-073 | Insight: `XLSX.utils.json_to_sheet` from untrusted rows без санитизации | `XLSX.utils.json_to_sheet(rows)` где `rows` из API | Санитизировать каждое scalar поле перед json_to_sheet; отдельный проход map. | Insight/Node/xlsx | `CWE-1236` | Map all values through sanitize before `json_to_sheet` / `aoa_to_sheet`. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-073 insight xlsx json_to_sheet -->
76
+ | INS-074 | Insight: `xlsx.writeFile` экспорт без нейтрализации формул в колонках | `XLSX.writeFile(wb, outPath)` после заполнения из БД | При записи ячеек применять `sanitizeForExcelCell`; тест на `=cmd|'` / `@SUM`. | Insight/Node/xlsx | `CWE-1236` | Never write raw user strings to xlsx cells; apply CSV/Excel injection defenses. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-074 insight xlsx writefile export -->
77
+ | INS-075 | Insight: `xlsx` read → re-export цепочка без ре-sanitization | `XLSX.read` затем `sheet_to_json` → обратно `json_to_sheet` | При re-export трактовать все строки как untrusted; sanitize on write. | Insight/Node/xlsx | `CWE-1236` | On re-export pipeline, treat every cell as untrusted input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-075 insight xlsx roundtrip -->
78
+ | INS-076 | Insight: mammoth `convertToHtml` без ограничения размера входного DOCX | `mammoth.convertToHtml({ path: userPath })` | `fs` stat + max size; stream reject; zip pre-check. | Insight/Node/mammoth | `CWE-409` | Enforce max doc size before mammoth; reject oversized ZIP/docx. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-076 insight mammoth size -->
79
+ | INS-077 | Insight: mammoth извлечение без hardening XML внутри DOCX (внешние сущности) | `mammoth.extractRawText({ path: p })` на недоверенном файле | Валидировать OOXML через безопасный unzip + parser с `noEnt`/disabled DTD. | Insight/Node/mammoth | `CWE-611` | Pre-validate docx zip and XML parts; disable entity expansion in XML pipeline. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-077 insight mammoth xxe -->
80
+ | INS-078 | Insight: `docx` npm / PizZip открытие без проверки compression ratio (zip bomb) | `new PizZip(buf)` / `getDocument` без лимитов | Сравнить `uncompressedSize` vs `compressedSize`; max total unzipped bytes; `yauzl` limits. | Insight/Node/docx | `CWE-409` | Enforce max uncompressed size and compression ratio for OOXML containers. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-078 insight docx pizzip zip bomb -->
81
+ | INS-079 | Insight: `JSZip` загрузка `.docx/.pptx` без лимита распакованного объёма | `zip.loadAsync(buf)` затем `file.async('string')` | `zip` generation options: `checkCRC32`; external `maxUncompressed` guard. | Insight/Node/JSZip | `CWE-409` | Track cumulative uncompressed bytes; abort on threshold (zip bomb). | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-079 insight jszip docx -->
82
+ | INS-080 | Insight: `pdfjs-dist` `getDocument` без лимита на размер/страницы | `pdfjsLib.getDocument({ url: userUrl })` | `http` fetch с max bytes; `disableAutoFetch` + range requests с cap. | Insight/Node/pdfjs-dist | `CWE-409` | Cap PDF bytes and pages; stream with limits. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-080 insight pdfjs getdocument -->
83
+ | INS-081 | Insight: `pdfjs-dist` workerSrc с недоверенного origin | `GlobalWorkerOptions.workerSrc = 'http://cdn.../pdf.worker.js'` | Self-host worker; `file://` или same-origin; SRI. | Insight/Node/pdfjs-dist | `CWE-611` | Host pdf.worker.js from same origin; integrity attribute. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-081 insight pdfjs worker -->
84
+ | INS-082 | Insight: `word-extractor` без таймаута и лимита памяти | `extractor.extract(path)` на сетевом каталоге | Обернуть в timeout; max file size; stream to temp. | Insight/Node/word-extractor | `CWE-409` | Timeout + size limit around word-extractor; reject huge binaries. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-082 insight word-extractor -->
85
+ | INS-083 | Insight: `docx` XML part `word/document.xml` парсится с `xml2js` `mergeAttrs` без отключения entities | `parseString(xml, { mergeAttrs: true })` | `explicitCharkey`, `explicitRoot`; `parseString` с `strict: true` + `noEnt` (libxml-based) или sax с `resolveEntities: false`. | Insight/Node/docx | `CWE-611` | Parse OOXML with XXE-safe XML settings; no external entities. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-083 insight docx xml2js -->
86
+ | INS-084 | Insight: ExcelJS `worksheet.addRow` с пользовательскими строками в отчёт | `worksheet.addRow([user])` | Sanitize each cell; set `numFmt` text for risky prefixes. | Insight/Node/exceljs | `CWE-1236` | Sanitize ExcelJS rows before commit; same rules as SheetJS. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-084 insight exceljs addrow -->
87
+ | INS-085 | Insight: `mammoth` `convertToHtml` + встроенные `styleMap` из пользователя | `convertToHtml({ styleMap: userMap })` | Allowlist styleMap strings; no raw user XML in style. | Insight/Node/mammoth | `CWE-611` | Do not pass user-controlled styleMap to mammoth; allowlist only. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-085 insight mammoth stylemap -->
88
+ | INS-086 | Insight: распаковка `.pptx` для превью без ratio check | `unzipper.Open.buffer(buf)` | `zip` bomb guards; max entries; total uncompressed. | Insight/Node/pptx | `CWE-409` | Same zip-bomb defenses as docx for pptx OOXML. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-086 insight pptx unzip -->
89
+ | INS-087 | Insight: `fflate` unzip `xlsx` array без лимита | `unzipSync(buf)` | `unzip` с streaming counters; max file count. | Insight/Node/xlsx | `CWE-409` | Limit entries and total bytes when using fflate/unzip on xlsx. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-087 insight fflate xlsx -->
90
+ | INS-088 | Insight: `pdfjs` `getMetadata` доверие к `/Title` для XSS в UI | `metadata.info.Title` в `innerHTML` | Escape metadata; textContent only. | Insight/Node/pdfjs-dist | `CWE-1027` | Treat PDF metadata as untrusted; never HTML-embed without encode. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-088 insight pdfjs metadata -->
91
+ | INS-089 | Insight: mammoth `embedImage` с пользовательским base64 | `embedImage: (id) => readUserFile(id)` | Validate image type/size; no path from user id. | Insight/Node/mammoth | `CWE-611` | Strict allowlist for embedded image resolution in mammoth. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-089 insight mammoth embedimage -->
92
+ | INS-090 | Insight: CSV → xlsx pipeline без нейтрализации (формула в CSV) | `XLSX.read` CSV `FSF` затем `writeFile` xlsx | Sanitize CSV fields before sheet; `'` prefix. | Insight/Node/xlsx | `CWE-1236` | Apply CSV injection rules before promoting to xlsx. | Атакующий внедряет формулу в CSV до экспорта в xlsx; при открытии в Excel возможна команда/внешняя ссылка (CWE-1236). | <!-- semantic_anchor: ins-090 insight csv xlsx -->
93
+ | INS-091 | Insight: `word-extractor` + последующая запись в HTML без escape | `extractor.extract(path).then(t=>div.innerHTML=t)` | `textContent` или DOMPurify; structured text. | Insight/Node/word-extractor | `CWE-1027` | Never assign extracted text to innerHTML without sanitization. | Атакующий подсовывает извлечённый текст в innerHTML; при отсутствии DOMPurify возможен XSS (CWE-1027). | <!-- semantic_anchor: ins-091 insight word-extractor -->
94
+ | INS-092 | OpenAI SDK: `chat.completions.create` без схемы ответа для JSON-логики | `openai.chat.completions.create({ messages })` затем `JSON.parse(content)` | `response_format: { type: 'json_schema', ... }` или `zod` parse после `parse` helper. | Insight/OpenAI SDK | `CWE-1027` | Use `json_schema` response_format or validate with Zod before branching logic. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-092 openai json schema -->
95
+ | INS-093 | OpenAI: доверие к `role`/`tool_calls` без проверки | `if (msg.role === 'system')` по ответу модели | Сервер решает роли; не доверять клиенту/assistant для authz. | Insight/OpenAI SDK | `CWE-1109` | Never branch security on model-supplied role strings; server-side allowlist. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-093 openai role trust -->
96
+ | INS-094 | OpenAI: `completion.choices[0].message.content` как команда без allowlist | `exec(JSON.parse(content).cmd)` | Schema validation; command allowlist; no shell from LLM output. | Insight/OpenAI SDK | `CWE-1027` | Validate structured output; reject unknown fields; no shell exec from model text. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-094 openai content exec -->
97
+ | INS-095 | OpenAI: streaming chunks собраны в объект без финальной Zod-проверки | `on('chunk')` + merge без `safeParse` | После stream: `Schema.safeParse(full)`; discard invalid. | Insight/OpenAI SDK | `CWE-1027` | Finalize streamed LLM output with schema validation. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-095 openai stream zod -->
98
+ | INS-096 | OpenAI: `tools`/`function` arguments без типизации | `JSON.parse(toolCall.function.arguments)` | Zod `function.arguments` per tool; strict types. | Insight/OpenAI SDK | `CWE-1027` | Per-tool Zod schema for JSON arguments from OpenAI. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-096 openai tools zod -->
99
+ | INS-097 | OpenAI: `system` + `developer` messages логируются через `electron-log` | `log.info('prompt', messages)` | Логировать только `requestId` + hash; не логировать system. | Insight/Electron/OpenAI | `CWE-201` | Redact system/developer prompts from electron-log; structured logging without secrets. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-097 openai electron-log prompt -->
100
+ | INS-098 | OpenAI: system prompt в `console.log` / renderer DevTools | `console.log(systemPrompt)` | `if (isDev)` guard; never log prompts in prod. | Insight/Electron/OpenAI | `CWE-201` | Ban console logging of system prompts outside sealed dev diagnostics. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-098 openai console system -->
101
+ | INS-099 | OpenAI: ответ модели напрямую в `ipcRenderer.send` без валидации | `ipcRenderer.send('ai', completion)` | Validate + serialize DTO; main process re-validates. | Insight/OpenAI/Electron | `CWE-1027` | Validate OpenAI payloads before IPC; duplicate validation in main. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-099 openai ipc send -->
102
+ | INS-100 | Electron 36: `BrowserWindow` без явного `nodeIntegration: false` | `new BrowserWindow({ webPreferences: { preload } })` | `nodeIntegration: false` явно; `contextIsolation: true`. | Insight/Electron | `CWE-94` | Always set `nodeIntegration: false` and `contextIsolation: true` explicitly in main. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-100 electron nodeintegration explicit false -->
103
+ | INS-101 | Electron: `webPreferences` без `contextIsolation: true` | `webPreferences: { preload: path }` | Добавить `contextIsolation: true` (default в новых Electron — проверить явно). | Insight/Electron | `CWE-94` | Explicit `contextIsolation: true` for every BrowserWindow. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-101 electron contextisolation true -->
104
+ | INS-102 | Electron: `ipcMain.handle` без проверки `event.senderFrame` | `ipcMain.handle('api', async (_e, args) => {...})` | `if (!event.senderFrame || event.senderFrame.url !== trusted)` return error. | Insight/Electron | `CWE-749` | Validate `event.senderFrame` / sender URL before handling IPC. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-102 electron ipc senderframe -->
105
+ | INS-103 | Electron: `ipcMain.handle` доверяет `event.sender` без `frame` | `ipcMain.handle('x', (e, a) => e.sender)` | Использовать `senderFrame` + `webContents.getURL()` allowlist. | Insight/Electron | `CWE-749` | Pair IPC handlers with sender frame / origin checks. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-103 electron ipc sender -->
106
+ | INS-104 | Electron: удалённый `preload` path из конфига пользователя | `preload: userConfig.preloadPath` | Allowlist path under `app.getAppPath()`; `path.resolve` + `startsWith`. | Insight/Electron | `CWE-94` | Never load preload from user-controlled paths; allowlist under app package. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-104 electron preload path -->
107
+ | INS-105 | Electron: `webPreferences.webSecurity: false` | `webPreferences: { webSecurity: false }` | `webSecurity: true`; `sandbox: true`. | Insight/Electron | `CWE-94` | Keep `webSecurity: true` except rare dev-only exceptions. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-105 electron websecurity -->
108
+ | INS-106 | Electron: `ipcMain.handle` + `shell.openExternal` с аргументом от renderer | `shell.openExternal(urlFromIpc)` | `new URL(url)` + allowlist scheme/host; block `file:`. | Insight/Electron | `CWE-749` | Validate URLs before `openExternal` from IPC payloads. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-106 electron openexternal ipc -->
109
+ | INS-107 | Electron: merge `defaultWebPreferences` из `userData` JSON | `webPreferences: { ...userPrefs }` | Не мержить user JSON в webPreferences; static hardened object. | Insight/Electron | `CWE-94` | Immutable hardened webPreferences; ignore user overrides for security keys. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-107 electron merge webprefs -->
110
+ | INS-108 | Electron: `session.setPermissionRequestHandler` всегда `cb(true)` | `cb(true)` | Deny-by-default; allowlist origins. | Insight/Electron | `CWE-749` | Default deny; explicit allowlist for media/geolocation. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-108 electron permission handler -->
111
+ | INS-109 | Electron: `protocol.registerFileProtocol` без path traversal check | `callback({ path: req.url })` | Normalize path; `startsWith` app base. | Insight/Electron | `CWE-22` | Validate file paths in custom protocols; prevent traversal. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-109 electron protocol traversal -->
112
+ | INS-110 | Electron: `desktopCapturer` + AI без user consent | `desktopCapturer.getSources` | Explicit consent UI; `fetch` constraints. | Insight/Electron | `CWE-200` | Gate screen capture behind explicit user consent. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-110 electron desktopcapturer -->
113
+ | INS-111 | Insight: `xlsx` `sheet_to_csv` затем email без escape | `XLSX.utils.sheet_to_csv(sheet)` в body | Sanitize for CSV/formula injection before email. | Insight/Node/xlsx | `CWE-1236` | Sanitize CSV exports from xlsx before messaging. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-111 insight xlsx sheet_to_csv -->
114
+ | INS-112 | Insight: `mammoth` `convertToHtml` + `innerHTML` в Electron | `innerHTML = result.value` | `DOMPurify.sanitize` or `textContent`. | Insight/Node/mammoth | `CWE-1027` | Sanitize mammoth HTML before DOM insertion. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-112 mammoth innerhtml -->
115
+ | INS-113 | Insight: `pdfjs` page text → SQL без параметризации | `page.getTextContent()` → `db.query(\`...\${t}\`)` | Parameterized queries; never concat LLM/PDF text. | Insight/pdfjs | `CWE-89` | Parameterize DB; treat PDF text as untrusted. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-113 pdfjs sql -->
116
+ | INS-114 | Insight: `docx` template engine `{{user}}` без escape | `doc.setData({ user: raw })` | Escape or docx-safe templating. | Insight/docx | `CWE-1236` | Escape template fields for docx generation. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-114 docx template -->
117
+ | INS-115 | Insight: OpenAI `responses.parse` / structured output без `strict: true` | `response_format` без strict | `strict: true` in json_schema where supported. | Insight/OpenAI | `CWE-1027` | Use strict JSON schema where API allows. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-115 openai strict schema -->
118
+ | INS-116 | OpenAI: логирование полного `messages` в `pino`/`winston` | `logger.info(messages)` | Redact messages; log only ids. | Insight/OpenAI | `CWE-201` | Redact OpenAI message bodies in logs. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-116 openai pino logger -->
119
+ | INS-117 | Electron: `contextBridge.exposeInMainWorld` с функцией без аргументов проверки | `exposeInMainWorld('api', { run: (x)=>ipc.invoke('x',x)})` | Validate in preload; main validates again. | Insight/Electron | `CWE-749` | Validate IPC args in preload bridge and main. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-117 contextbridge -->
120
+ | INS-118 | Electron: `ipcMain.on` (legacy) вместо `handle` без проверки sender | `ipcMain.on('evt', ...)` | Migrate to `handle` + sender checks. | Insight/Electron | `CWE-749` | Prefer `handle` with sender validation over legacy `on`. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-118 ipcmain on -->
121
+ | INS-119 | Insight: `pdfjs` `getDocument` data URL с user data | `getDocument({ data: atob(userB64) })` | Reject data URLs from user; size limit. | Insight/pdfjs | `CWE-409` | Block unbounded base64 PDF from user input. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-119 pdfjs data url -->
122
+ | INS-120 | Insight: `word-extractor` на UNC path без доверия | `extractor.extract('\\\\srv\\share\\doc.doc')` | Allowlist paths; local temp copy with scan. | Insight/word-extractor | `CWE-22` | Restrict UNC/network paths for extraction. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-120 word-extractor unc -->
123
+ | INS-121 | Insight: xlsx `cellStyles` из пользователя | `cell.s = userStyle` | Reject style objects; allowlist. | Insight/xlsx | `CWE-1236` | Do not apply user-controlled styles that embed formulas. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-121 xlsx cellstyles -->
124
+ | INS-122 | Insight: mammoth `convertToMarkdown` → markdown XSS | `innerHTML = md.render(mdText)` | Sanitize markdown HTML; trusted renderer. | Insight/mammoth | `CWE-1027` | Sanitize markdown output from mammoth. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-122 mammoth markdown -->
125
+ | INS-123 | Insight: `docx` hyperlink из пользователя | `new Hyperlink(userUrl)` | Allowlist URL schemes. | Insight/docx | `CWE-20` | Validate hyperlinks in generated docx. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-123 docx hyperlink -->
126
+ | INS-124 | OpenAI: `parallel_tool_calls` без лимита веток | `parallel_tool_calls: true` | Cap concurrent tool calls; timeout. | Insight/OpenAI | `CWE-1027` | Limit parallel tool execution from model. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-124 openai parallel tools -->
127
+ | INS-125 | OpenAI: кэш ответа LLM на диск без шифрования | `fs.writeFileSync(cachePath, content)` | Encrypt at rest; DPAPI. | Insight/OpenAI | `CWE-311` | Encrypt cached LLM responses; no plaintext PII. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-125 openai cache -->
128
+ | INS-126 | Electron: `nativeImage` из пользовательского пути без проверки | `nativeImage.createFromPath(userPath)` | Path allowlist + size. | Insight/Electron | `CWE-22` | Validate paths for nativeImage loads. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-126 nativeimage -->
129
+ | INS-127 | Electron: `Menu` item `click` с `remote` shell | `shell.openExternal(userUrl)` в menu | Same URL validation as IPC. | Insight/Electron | `CWE-749` | Validate URLs in menu handlers. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-127 menu shell -->
130
+ | INS-128 | Insight: `xlsx` shared strings table pollution | Уязвимость при merge | Sanitize shared strings on import. | Insight/xlsx | `CWE-1236` | Sanitize shared strings when merging workbooks. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-128 xlsx sharedstrings -->
131
+ | INS-129 | Insight: `pptxgenjs` text from user без sanitize | `slide.addText(user)` | Sanitize for OLE/script injection patterns. | Insight/pptx | `CWE-1236` | Sanitize user text in pptxgenjs slides. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-129 pptxgenjs -->
132
+ | INS-130 | Insight: `pdf-lib` embed font from user path | `embedFont(fs.readFileSync(userFont))` | Allowlist font bytes. | Insight/pdf | `CWE-22` | Restrict embedded fonts to trusted sources. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-130 pdf-lib font -->
133
+ | INS-131 | OpenAI: `temperature`/`top_p` max для production | `temperature: 2` | Cap temperature for deterministic ops. | Insight/OpenAI | `CWE-1027` | Bound sampling params for production AI paths. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-131 openai temperature -->
134
+ | INS-132 | OpenAI: отсутствие `seed` для воспроизводимости аудита | `create({...})` | `seed` where needed for audit. | Insight/OpenAI | `CWE-1109` | Use seed for reproducibility when policy requires. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-132 openai seed -->
135
+ | INS-133 | Electron: `powerMonitor` + IPC без auth | `powerMonitor.on('suspend', ()=>ipc.send(...))` | Do not leak state on IPC without auth. | Insight/Electron | `CWE-200` | Gate system events on IPC. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-133 powermonitor ipc -->
136
+ | INS-134 | Electron: `clipboard` write из renderer без проверки | `clipboard.writeText(user)` | Main process mediation. | Insight/Electron | `CWE-749` | Mediate clipboard IPC in main. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-134 clipboard -->
137
+ | INS-135 | Insight: `mammoth` + `cheerio` load без sanitize | `cheerio.load(html)` | `sanitize-html` on HTML. | Insight/mammoth | `CWE-1027` | Sanitize cheerio HTML from mammoth. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-135 mammoth cheerio -->
138
+ | INS-136 | Insight: `xlsx` password-protected workbook без rate limit | `XLSX.read(data, {password: guess})` | Rate limit brute force. | Insight/xlsx | `CWE-307` | Rate-limit xlsx password attempts. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-136 xlsx password -->
139
+ | INS-137 | Insight: `pdfjs` `getOperatorList` утечка в лог | `console.log(opList)` | No verbose op logging. | Insight/pdfjs | `CWE-201` | Do not log PDF operator lists in production. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-137 pdfjs operatorlist -->
140
+ | INS-138 | OpenAI: `metadata` поля с PII в `store` | `metadata: { email: user.email }` | Strip PII from metadata. | Insight/OpenAI | `CWE-201` | Minimize OpenAI request metadata. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-138 openai metadata -->
141
+ | INS-139 | Electron: `globalShortcut` регистрация без проверки фокуса | `globalShortcut.register` | Scope + unregister on blur. | Insight/Electron | `CWE-749` | Validate focus before global shortcuts. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-139 globalshortcut -->
142
+ | INS-140 | Electron: `dialog.showSaveDialog` path в `openExternal` | `shell.openExternal(savedPath)` | Validate same as open. | Insight/Electron | `CWE-749` | Validate save dialog paths before opening. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-140 dialog save -->
143
+ | INS-141 | Insight: `xlsx` CSV delimiter injection | `sep=;` in cell | Strip `sep=` prefix. | Insight/xlsx | `CWE-1236` | Handle CSV delimiter injection in xlsx roundtrip. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-141 csv sep -->
144
+ | INS-142 | Insight: `docx` `header`/`footer` user HTML | `header.addHtml(user)` | Sanitize HTML fragments. | Insight/docx | `CWE-611` | Safe XML/HTML for headers/footers. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-142 docx header html -->
145
+ | INS-143 | Insight: `pdfjs` `getAnnotations` исполнение | `annotation` без validate | Sanitize annotation text. | Insight/pdfjs | `CWE-1027` | Treat PDF annotations as untrusted. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-143 pdfjs annotations -->
146
+ | INS-144 | OpenAI: `response_format` JSON + `tools` одновременно без тестов | mixed | Integration tests for schema. | Insight/OpenAI | `CWE-1109` | Test tools + JSON schema together. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-144 openai tools json -->
147
+ | INS-145 | Electron: `BrowserView` без `webPreferences` копии | `new BrowserView()` | Explicit hardened prefs. | Insight/Electron | `CWE-94` | Set full webPreferences on BrowserView. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-145 browserview -->
148
+ | INS-146 | Electron: `utilityProcess` fork без argv allowlist | `utilityProcess.fork(path, userArgv)` | Allowlist argv. | Insight/Electron | `CWE-749` | Validate utility process arguments. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-146 utilityprocess -->
149
+ | INS-147 | Insight: `mammoth` `ignoreEmptyParagraphs: false` + huge doc | `ignoreEmptyParagraphs: false` | Size limits. | Insight/mammoth | `CWE-409` | Combine mammoth options with size caps. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-147 mammoth empty -->
150
+ | INS-148 | Insight: `xlsx` `sheet_to_json` `defval` user injection | `defval: userDef` | Static defval. | Insight/xlsx | `CWE-1236` | Do not use user input as defval in sheet_to_json. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-148 xlsx defval -->
151
+ | INS-149 | OpenAI: `max_tokens` не ограничен для UI path | `max_tokens: 65536` | Cap for UI-facing paths. | Insight/OpenAI | `CWE-409` | Bound max_tokens for interactive flows. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-149 openai maxtokens -->
152
+ | INS-150 | Electron: `safeStorage` key fallback | `safeStorage` unavailable → plaintext | Fail closed; no plaintext fallback. | Insight/Electron | `CWE-312` | No plaintext fallback when safeStorage unavailable. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-150 safestorage -->
153
+ | INS-151 | Insight: Infinity release checklist — отсутствие `npm audit` в CI для Insight deps | `# skip npm audit` | `npm audit --audit-level=high` | Insight/DevOps | `CWE-1104` | Run npm audit in CI for Insight stack. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-151 npm audit -->
154
+ | INS-152 | Insight: `electron` `remote` module (deprecated) | `require('@electron/remote')` | Remove remote; IPC + preload. | Insight/Electron | `CWE-94` | Ban `@electron/remote`; use contextBridge. | Атакующий доставляет входные данные, соответствующие anti-pattern; реальный ущерб зависит от приёмника (sink), конфигурации и границ доверия. | <!-- semantic_anchor: ins-152 electron remote -->
@@ -0,0 +1,26 @@
1
+ {
2
+ "skill_id": "hexvibe-desktop-vsto",
3
+ "name": "Desktop & Office Integration Suite",
4
+ "activation_triggers": [
5
+ "ins-vsto-addin",
6
+ "ins-electron-ipc",
7
+ "ins-nsis-installer",
8
+ "ins-vsto-key",
9
+ "ins-office-desktop"
10
+ ],
11
+ "relevant_extensions": [
12
+ ".cs",
13
+ ".ts",
14
+ ".js",
15
+ ".nsi",
16
+ ".config"
17
+ ],
18
+ "tools": [
19
+ "semgrep",
20
+ "syft",
21
+ "trufflehog"
22
+ ],
23
+ "rules_path": "core/skills/desktop-vsto-suite/patterns.md",
24
+ "few_shot_examples": "core/gold-standard-testbed/insight_vulnerable.ts",
25
+ "security_priority": 7
26
+ }