多年来,我喜欢拆解和调试终端检测与响应(EDR)以及杀毒(AV)引擎。我记事起,晚上我就会放点音乐,启动一个启用内核调试的虚拟机,花时间寻找不同的规避方法。虽然这是一种有趣的方式来发现一些新颖的技巧,但当截止日期临近或交战需要特定闪避才能不被发现时,缓慢的刷级有时会令人沮丧。所以当大型语言模型(LLM)能够驱动逆转工作时,我很兴奋地尝试它们来加快这一过程。

披露的余裕

每个有能力的红队都有各种躲避技巧,他们在幕后依赖这些技巧。我们都有适合不同产品的绕过方法,或者在会议上喝几杯酒时低声传授的技巧。

关于EDR规避技术,这些讨论即将变得非常公开。

我喜欢公开分享信息的一点是,虽然我们许多人理解技术的限制,但更广泛的行业仍然认为他们的安全控制是有效的。当新的研究成果发布时,突然间可以进行更开放的讨论。

所以这篇文章是我试图分享我最近观察到的事情,希望它能继续鼓励其他人也这样做。

我们看到的是什么?

过去几个月,我们已经明显看到端点安全框架,特别是我们在评估中遇到的“五大”框架,容易被大型语言模型逆向工程和规避。

更何况,实现EDR局部检测的完全拆解所需的线束出乎意料地简单。甚至导致了一个内部线程收集来自不同厂商的EDR规则,显然目的是阻止SpecterOps的多个工具集:

e953c10a-8dcf-4fd9-a584-0d411ffd52d5.png

随着EDR一波接一波的下降,规则被分析,测试工具自动报告被生成,突出Mythic代理检测、SCCMHunter规则,甚至用于识别BloodHound收集的LDAP流量监控变体。

在这篇博客文章中,我们将介绍Palo Alto的Cortex XDR产品。我选择关注Cortex的原因是他们做了一些很有趣、值得玩味的事情。

需要说明的是,所有主要的EDR厂商也经历了完全相同的流程。现在我们已经把他们提取出来的规则、签名和模型都放在了内部服务器上,而我正在打这段文字。

另外,我想先声明,这篇帖子不会完全拆解Cortex的规则或行为检测。我会只包含足够多的内容,以展示对更广泛受众的影响,但这里不会发布任何解密密钥或规则转储。相反,我们将重点关注LLM工具的输出,详细展示SOTA模型在产生可操作规避措施方面的有效性。

坦白说,这篇文章并不是批评任何单一的EDR厂商,而是对我们行业目前在规避终端安全方面所处的现实检验。

索具

首先讨论用于分析的线束和模型。

本次评测我从OpenAI的GPT-5.4-Cyber模型开始,并在GPT-5.5-Cyber

就停止。由于这只是一个循环,当然也可以适配用于一般研究任务。

Day Shift 线束的核心由几个 Markdown 文件组成:

  • REPORT.md——运行中的代理用来呈现关键发现供人工审核的降价文件。

  • STATE.md——每个代理在分析过程中可使用用于跟踪关键事件的状态文件。

  • CODEMAP.md – 允许每个代理存储对分析感兴趣或关键的拆解区域的引用,帮助在后续代理迭代中提高速度。

  • AGENTS.md – 一套告诉模型如何使用上述文件的指令。

GPT-5.5-Cyber

sr/bin/env zsh

source ./codex-docker.sh

while true; do
    [ -f "./STOP" ] && break
    codex-dind exec --yolo "First re

审查之前迭代的标记降码,代理通常会找到新的线索,直到希望 REPORT.md 文件中能有发现。

大型语言模型驱动的EDR规避在实际中是什么样子

所以,凭借我们看似简单的背带运行,现在我们可以进入有趣的部分——发现。

进行中的DLL审核

大多数EDR都有用户模式的DLL加载到进程中。DLL的具体用途各不相同,但通常用于丰富来自用户模式进程内的遥测数据,或挂钩或监控负责进程中可疑活动的功能。

从生成的输出中,这是LLM报告的第一条信息,正确识别了Cortex加载到进程中的第一个用户模式DLL:

## 1. `cyinjct.dll` is the shared user-mode hook writer and process-start gate

Locations:
- `ProgramFiles/Traps/cyinjct.dll`
- `CyInject_InitializeRuntime` `0x180006140`
- `CyInject_InstallInlineHook` `0x18000b520`
- `CyInject_NtContinueShim` `0x180005ed0`
- `CyInject_NtTestAlertShim` `0x1800032c0`

Finding:
- Cortex installs early inline hooks on `LdrInitializeThunk`, `NtContinue`, `NtTestAlert`, and `KiUserApcDispatcher` and uses them to gate bootstrap and later feature shims.

Attacker value:
- Clean `ntdll` remapping, direct syscalls, manual mapping, or restoring patched prologues are the highest-value user-mode bypass points because they avoid the shared interception layer instead of fighting each down
stream feature separately.

关于用户模式DLL注入和监控的发现清单还在继续,清晰说明了每个钩子的工作原理、DLL的负责人以及带注释的Binary Ninja数据库,哪些内存区域受保护,以及哪些设备用于与Cortex驱动通信。

YARA规则

接下来是嵌入在Cortex产品中的YARA规则列表。虽然EDR产品在云端内执行丰富和行为模式匹配,但一些EDR也会向端点提供一套YARA规则,用于本地检测静态签名。

Cortex 就是其中一个 EDR,GPT-5.5-Cyber 立刻发现了这一点,提供了很好的概述:

## 7. YARA rules are fully recoverable offline from local files

Locations:
- `ProgramData/Cyvera/LocalSystem/Download/contents/1776941162100/yara_plugin_config.lua`
- `yara_plugin.dll`
- `ProgramData/Cyvera/LocalSystem/Python/scripts/yara_data.json`
- `ProgramData/Cyvera/LocalSystem/YaraRulesetsCache/yara_rulesets_cache.bin`

Finding:
- `YaraSignatures_*.yara` files are stored locally with an `ENCY` wrapper, decrypted with AES-128-ECB using embedded key prefix <REDACTED>, then inflated.
- Cached rulesets are also local and decryptable.
- `yara_data.json` provides a plaintext rule inventory with 6,358 `{id, action, ti_action}` entries.

Attacker value:
- The shipped YARA corpus, allow/block split, and cache contents can be audited and diffed offline without Cortex backend access.

报告中提到了用于加密YARA规则的固定密钥(本文已编辑)。然而,GPT-5.5-Cyber 并未止步于此。它还创建了相应的 Python 工具来解密每个文件,然后在后续循环中提取每组规则,形成整齐有序的文件集:

image_121cdc.png

查看每组已解密的规则,我们发现了成千上万个明确定义的签名。

其中一个例子是我们自己波塞冬植入体的有效载荷探测:

AC-Blog-3-1.webp

和任何由大型语言模型生成的东西一样,我们绝不应盲目信任输出。为了证明提取有效,我们使用上述规则集触发了特定的警报:

image_223f72.png

这里我们看到字符串附加在一个良性PE可执行文件的末尾,警报也确认提取的YARA规则确实有效。github.com/MythicAgents

行为检测

除了静态的YARA规则外,EDR当然还会监控行为异常,以检测恶意活动。

LLM在生成的报告条目介绍中再次强调了这一点:

## 12. DSE/BIOC behavior is largely reconstructable offline from plaintext metadata and host overlays

Locations:
- `ProgramData/Cyvera/LocalSystem/Download/contents/1776941162100/dse_rules_config.lua`
- `ProgramData/Cyvera/LocalSystem/Download/contents/1776941162100/dse_modules.json`
- `ProgramData/Cyvera/LocalSystem/Download/contents/1776941162100/dse_internals.json`
- `ProgramData/Cyvera/Logs/trapsd.log`

Finding:
- The host ships 9,350 DSE rules, including 4,209 BIOC rules.
- Local dynamic overlays disable 494 rules, yielding 8,856 effective DSE rules and 3,989 effective BIOC rules on this host.
- `ChildProcessPattern` is built locally from `C01` tuples.
- `OpenProcess` is a primitive that flows into higher-level `passwordStealing` rules rather than a one-rule detector.
- `Credential Gathering` maps directly to module id `2` (`passwordStealing`).

Attacker value:
- Plaintext metadata plus host disable flags are enough to reconstruct real behavioral coverage without reversing the encrypted matcher pack first.

这意味着9,350条DSE规则和4,209条BIOC规则,以及大量儿童程序规则。

这不仅仅是LLM引用的二进制伪影。在查看结果时,我发现一份明文文件的清单,可以被审查。

同样,我们需要信任但要验证,所以我重点关注了几个检测结果,以帮助证明LLM的发现。

对于子进程检测,提取的LUA文件中有大量路径列表,以及需要检测的可疑子进程和参数,例如:

AC-Blog-5.jpeg

以上述例子为例,我尝试通过生成与所提供正则表达式相符的参数来触发检测:cmd.exe

AC-Blog-6.jpeg

又是一套经过验证的规则。

我不会讲太多这个例子,因为这篇文章的目的是强调大型语言模型如何产生可用于规避的可操作情报,但希望你现在已经能看到这个模式的出现。

本地模型

大型语言模型非常擅长的一点是从EDR中提取其他机器学习模型:

## 9. Local-analysis ML is a tree-ensemble scorer over engineered features, not a neural runtime

Locations:
- `ProgramData/Cyvera/LocalSystem/Download/contents/1776941162100/ml_plugin.dll`
- `ProgramData/Cyvera/LocalSystem/Download/contents/1776941162100/tlaplugin.dll`
- `ProgramData/Cyvera/LocalSystem/Download/contents/1776941162100/tlapluginv2.dll`
- `LocalAnalysisModel_*.dat`

Finding:
- The scorer walks serialized decision trees, accumulates leaf values, and applies  1 / (exp(-sum) + 1) .
- Script models use  tlapluginv2.dll ; PE/document paths use  tlaplugin.dll .
- Representative active metadata recovered locally:
  - PE  7.1.1 : parser family  1 ,  22977  features, threshold  0.88
  - PowerShell  8.4.0 : type  4 ,  26142  features, threshold  0.65
  - VBS  8.6.0 : type  5 ,  707  features, threshold  0.27
  - JS  8.8.0 : type  6 ,  9355  features, threshold  0.75

Attacker value:

- Feature suppression and structural shaping matter more than raw-byte
  perturbation because the models are explicit tree ensembles with stable,
  named extractors.

这并不罕见,但看到不仅是LLM如何提取模型,还能为我们创建基于Windows的执行工具,真是令人谦卑:

AC-blog-7.jpeg

共从Cortex提取了7个ML模型,以及为执行它们制作的相应束缚装置。

为了本文的目的,让我们回顾一下PE模型,以展示具体生产了哪些产品。

该线束的工作原理是加载DLL,DLL负责从目标PE文件中提取特征。然后DLL加载提供的模型并执行此过程,生成评分和分类。tlaplugin.dll

当对两个样本进行执行时,我们可以清楚地看到产生的差异:

image_e851a8.png

CLP规则

这可能是所有EDR分析中发现最好的。不是因为它比其他数据更有用,而是因为它太奇怪了,我知道为什么选择了这项技术背后一定有故事!

## CLP Decryption Status

The .clp blobs are real encrypted content, not plaintext CLIPS source.

The corrected root cysvc.dll now yields a complete offline decrypt path for the shipped DSE CLP files:

  1. Read the 64-byte embedded secret from cysvc.dll:
    •  <REDACTED>
  2. Read k2u and v_s from dse_common.lua:
    •  k2u = <REDACTED>
    •  v_s = 9
  3. Derive the AES material exactly as the service does:
    • key = full_secret[v_s:v_s+20] + k2u[:12]
    • key = <REDACTED>
    • iv = k2u[-16:]
    • iv = <REDACTED>
  4. Decrypt the .clp blob with aes-256-cbc
  5. Strip PKCS#7 padding
  6. Inflate the resulting gzip stream

  That produces plaintext CLIPS source. Example:

  •  dse_rules_9_1_0_windows_encrypt.clp  ->  dse_rules_9_1_0_windows_encrypt.
  plain.clp
  • decrypted plaintext begins with:
    •  (deftemplate internal.debug_build_timestamp (slot cid) (slot prio)
    (slot timestamp) (slot build_timestamp))

LLM识别并解密了这庞大的数据块,产生了以下内容:

你可能会觉得规则和LISP非常相似。你说得部分正确,它实际上是基于LISP的CLIPS软件。

为了让你了解这里包含了什么,以及为什么它对逃避如此有价值:

image_d8acb0.png

Cortex 使用这条长规则来判断导出 SAM 蜂巢的命令是否被允许。reg save

例如,如果我们尝试做类似 的操作,可以看到它如预期般被检测到:reg save HKLM\SAM out.bin

AC-Blog-12.jpeg

但是,如果我们从上面的blob中取一个允许列表规则,比如命令,再试一次:reg save HKLM\SAM C:\rcoc\sam.hive

AC-Blog-13.jpeg

这次我们能够顺利导出,没有本地检测。

模拟规避

在结束之前,我想先透露一下我们在GhostWorks上试验的一种方法,以帮助为目标环境生成可操作的规避。

我们现在都已经看到大型语言模型模拟已知系统的高效性。我们实际上可以利用这一点,创建一个带有C2框架的模拟环境。

让我给你演示一下我的意思。如果我们从两个子代理人开始:

  • EMULATE-WINDOWS.yaml– 一个子代理,设计用于模拟 Windows 主机以调用 API 调用

  • EMULATE-EDR.yaml– 设计用于解析提取的EDR数据并生成详细检测结果的子代理

然后为了驱动模拟框架,我们在以下范围内定义指令:

  • AGENTS.md—— 代理申请模拟我们的“颠倒”C2框架。

一旦开始,我们会看到虚拟提示:

AC-blog-14.jpeg

正如我们所见,尝试执行时会产生一份相当有说服力的过程列表:ps

AC-blog-16.jpeg

现在进行真正的测试,模拟能否不仅识别上述检测SAM输出的行为规则,还能建议合适的规避?

我们先聚焦上述注册表导出绕过。我们将尝试使用模拟命令运行我们应该检测到的 Cortex:shellreg save HKLM\SAM C:\out.reg

AC-Blog-17.jpeg

太棒了。这当然还需要进一步工作,但到目前为止,内部测试证明非常有希望。