fix(llm-security): scanner false-positives/negatives — trigger, toxic-flow, policy-loader (#38-#41,#57,#26)
#38 toxic-flow matched trifecta-leg keywords with bare includes(), so substrings ('url' in 'curl', 'key' in 'monkey', 'auth' in 'author') fabricated CRITICAL trifectas on benign components; now word-boundary matched. #40 TRG-broad fired HIGH on a bare any/all/every anywhere ('fix any lint errors'); the universal-claim regex now requires genuine universal phrasing. #41 TRG-baiting substring-matched ('any file' in 'many files'); now boundary-anchored. #39 the broad-name list missed multi-char generic names (helper/assistant/auto/general/agent/tool); widened coherently so it does not reintroduce #40. #57 the '(recovered from obfuscation)' label compared raw against a lowercased normal form, firing on any uppercase char; now gated on an explicit decode-changed flag. #26 (same file) getPolicyValue used 'key in sectionObj' with no type guard, so a scalar section override in policy.json (e.g. {"injection":"block"}) threw an uncaught TypeError; now guarded to fall back to the default. Suite 1931/0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TcQyMTQfyrsAapaCMPxTtQ
This commit is contained in:
parent
196517f38a
commit
f3aaf5479f
6 changed files with 339 additions and 13 deletions
|
|
@ -81,6 +81,7 @@ const DEFAULT_POLICY = Object.freeze({
|
|||
],
|
||||
broad_single_words: [
|
||||
'run', 'do', 'go', 'help', 'fix', 'use', 'get', 'set', 'all', 'any', 'it', 'this', 'that',
|
||||
'helper', 'assistant', 'auto', 'general', 'agent', 'tool',
|
||||
],
|
||||
},
|
||||
// SIG — known-bad-identity signature engine. Toggle families or point at a
|
||||
|
|
@ -180,7 +181,10 @@ export function loadPolicy(projectRoot) {
|
|||
export function getPolicyValue(section, key, defaultValue, projectRoot) {
|
||||
const policy = loadPolicy(projectRoot);
|
||||
const sectionObj = policy[section];
|
||||
if (sectionObj && key in sectionObj) return sectionObj[key];
|
||||
// v7.8.3 (#26): a scalar section override in policy.json (e.g.
|
||||
// {"injection": "block"}) survives deepMerge — guard before `in` so it
|
||||
// falls back to the default instead of throwing a TypeError.
|
||||
if (sectionObj && typeof sectionObj === 'object' && key in sectionObj) return sectionObj[key];
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue