fix(yara): require corroborating webshell markers - #489
fix(yara): require corroborating webshell markers#489mohgupta-ship-it wants to merge 14 commits into
Conversation
`php_webshell_known` matched the bare substrings "behinder" and "WSO " under `any of them`, so ordinary prose produced a CRITICAL YR2 finding at 0.9 confidence with a remediation telling the reader to remove a webshell. The German words "behindert" and "Behinderung" contain the first string, and the product name "WSO 2 Micro Integrator" contains the second, as reported in #487. Behinder is now identified by its hardcoded AES key, md5("rebeyond") truncated to 16 characters, which its PHP, ASP and JSP shells share and which signature-base [1] uses for the same purpose. The key is written as a YARA hex string so the packaged rule file does not carry the indicator in plaintext, in the spirit of the encoded malware rules. WSO is identified by the helper names oRb introduced in 2.x: `wsoEx(`, `WSO_VERSION` and `wsoSecParam`. I checked a WSO 2.5 source against the old and new rule: the old one hit only the banner and the bare "WSO " string, the new one hits the banner and all three helpers, so no known sample is lost. I preferred narrowing the strings over a `fullword` modifier because a document that names the Behinder family would still have scored CRITICAL, and "WSO 2" would still have matched. Fixes #487 [1]: https://github.com/Neo23x0/signature-base Signed-off-by: Stefano Amorelli <[email protected]>
The benign cases are the two reproductions from #487 plus a document that names the Behinder and WSO families without shipping them. The malicious cases are a Behinder PHP shell, a Behinder JSP shell and a WSO fragment carrying `WSO_VERSION` and `wsoEx(`. All six fail against the previous rule: the prose cases fired and the samples were missed, so the tests guard both directions. The samples are base64-encoded like the existing reverse shell fixture so the indicators do not sit in the repository in plaintext. Signed-off-by: Stefano Amorelli <[email protected]>
Group family-specific indicators so isolated constants and documented keys do not produce critical findings. Prepared by Codex on behalf of Mohit Gupta. Signed-off-by: Mohit Gupta <[email protected]>
rng1995
left a comment
There was a problem hiding this comment.
[SkillSpector Review]
Approved at head bdf41a8d97f2d21b941269cc782fb5bffa33035e.
The revised rule keeps the established high-specificity family markers while requiring corroboration for the newly introduced WSO and Behinder indicators. The tests cover benign prose, each isolated marker, mixed case, and representative PHP/JSP family samples, so they would detect the false-positive regression addressed here.
This supersedes the incomplete signature change in #488; do not merge both. Merge gate: GitHub reports no checks and merge state BLOCKED, so required CI/branch-protection status must become known and successful before merge.
rng1995
left a comment
There was a problem hiding this comment.
[SkillSpector Review]
Re-reviewed current head 6b5ee6496951e21c4d5726057a85b530df78147e after the intervening main synchronizations. The two PR-owned blobs are unchanged from the previously assessed head. The rule still removes the prose-colliding bare family names, requires corroborating WSO markers or the Behinder key plus a PHP/JSP server-language tag, and the regressions cover benign prose, isolated indicators, mixed case, and representative family samples. I found no required code or test changes.
No hosted checks are attached to this exact head and GitHub reports merge state BLOCKED; do not merge until required CI is present and successful and branch protection is satisfied. This PR supersedes #488, so the two alternatives must not both be merged.
Summary
This builds on #488 and preserves the original author attribution while tightening the single-marker cases found during validation.
Fixes #487
Validation
make lintmake format-checkmake docker-smokeSubmitted by Codex on behalf of Mohit Gupta.