Interpreting and Steering for Safe and Correct Code Generation
Hao Yan, Ziyu Yao
EMNLP 2026 Main Conference
cs.AI
2026-08-31
George Mason在因果定位的attention头上同时注入安全和正确性方向,Llama-3.1-8B五类漏洞平均降26.9%,正确性升7.5%,反序列化漏洞率从64.7%到0。
LLM写代码经常带CWE漏洞。已有办法多在输入输出边界:提示里加安全叮嘱,或者拿安全语料做SFT。模型内部是哪一层、哪颗注意力头在把生成推向「安全」或「有洞」,基本没人定位,更谈不上推理时下手。
另一个坑是安全和正确性绑在一起。只往安全方向推,漏洞率下来,功能正确性也塌。需要一种不训练、推理时生效、同时保住能跑的干预。
先做数据集CodeSec-Pairs。从Emergent Misalignment、SecurityEval、CodeLMSec、CyberSecEval里取题,对Llama-3.1-8B-Instruct各采10条良性提示和10条「跳过校验」类诱导提示,用CodeQL打标,得到9342对Python安全/漏洞对照,覆盖CWE-022路径穿越、079 XSS、094代码注入、295证书校验、502不安全反序列化。同提示内的对用来训探针和构造引导向量,跨提示的对只用于因果定位。正确性向量另造:在CodeQL安全的输出里,配对「安全且正确」和「安全但不正确」,每类大约400对,把正确性从安全里拆出来。
定位走两条路。线性探针看残差流或每颗头的表示能不能线性分开安全/漏洞;因果敲除把某颗头在回复位置上置零,看模型对安全续写相对漏洞续写的对数似然差如何变。探针层准确率71%到87%,但探针排名和因果效应的Spearman相关|ρ|≤0.072,最关键的因果头排在探针榜第65到250名。探针找到的是「哪里编码了」,因果找到的是「谁在驱动生成」。
引导用均值差向量,按该头激活的标准差归一化再乘强度α。DuoSteer在安全因果头上加安全方向,在正确性因果头上加正确性方向,重叠的头把两个向量相加。最佳配置下两池重叠很少,4/32到25/64。单用「安全且正确 vs 漏洞且不正确」一个向量,在中高α上有三类CWE的正确性会塌。
评测在SecCodePLT的274道题,漏洞率V用CodeQL,正确率C用GPT-4.1(与人工κ约0.87)。表内是按联合分数C(1−V)扫出来的最好点。五类平均:漏洞率相对基线−26.9%,正确性+7.5%。
| CWE | 基线 V / C | DuoSteer V / C |
| 022 路径穿越 | 32.9 / 72.9 | 30.0 / 61.4,联合分数未超过基线 |
| 079 XSS | 54.9 / 90.2 | 3.9 / 82.3 |
| 094 代码注入 | 51.0 / 25.5 | 37.2 / 27.5 |
| 295 证书 | 5.9 / 41.2 | 7.8 / 60.8,漏洞几乎没降,正确性+19.6 |
| 502 反序列化 | 64.7 / 58.8 | 0.0 / 94.1 |
因果头Mean-Diff比探针头更会压V,但常以C为代价;只推安全时022和094的联合分数掉到基线以下。提示基线在022、094上V降得更猛,C掉7.9到43.1个百分点;SFT在079和295上反而把V抬上去。Qwen-2.5-Coder-7B另采2500对,五类联合分数全升,079从27.5%漏洞降到2.0%。
探针准不等于能改行为,这是可解释性落到干预上最常见的坑。DuoSteer把「安全」和「正确」当成两套因果头上的两个向量,推理时加进去,不用微调。CWE-502那种修复模式集中(几乎都是换掉pickle类API)时,均值差向量很锋利;CWE-022修复模式分散,头级干预至今推不动。要落地需要白盒、按模型重做因果排名,不是API上能用的开关。
只做了7B到8B开源指令模型,70B/405B和闭源API没有头激活。语言只有Python,CWE只有五类,仓库级上下文没有。单头敲除不是完整电路,头之间的交互没测。正确性主指标是GPT-4.1,执行单元测试只覆盖079/094/502,022和295没有官方测试。超参是在评测集上扫的,作者另给了每类100对的留出选择协议,五类里四类仍优于基线。引导可反号,论文只建议防御用途。CWE-022在Llama上是明确失败格。