lint: replace proxy mutation guard with opengrep

This commit is contained in:
jesse-merhi
2026-05-07 14:41:35 +10:00
committed by Jesse Merhi
parent f05e2222f3
commit 9cc5e49e65
8 changed files with 1014 additions and 788 deletions

View File

@@ -4,8 +4,8 @@
# DO NOT EDIT BY HAND. Re-run the compile script after editing source rules.
#
# Source rules dir: security/opengrep/rules/openclaw-policy
# Generated at : 2026-04-30T09:09:41.198Z
# Rule count : 148
# Generated at : 2026-05-07T04:40:02.803Z
# Rule count : 154
rules:
- id: ghsa-25gx-x37c-7pph.openclaw-novnc-x11vnc-missing-auth
message: x11vnc starts without VNC authentication; avoid -nopw and require password auth when exposing noVNC observer access.
@@ -5010,3 +5010,513 @@ rules:
- "**/*.test.mjs"
patterns:
- pattern: http2.connect(...)
- id: openclaw-policy-managed-proxy-runtime-mutation.managed-proxy-process-env-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate proxy-related process.env runtime state.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- CWE-441
category: security
confidence: HIGH
detector-bucket: precise
source-rule-id: managed-proxy-process-env-mutation
source-file: security/opengrep/rules/openclaw-policy/managed-proxy-runtime-mutation.yml
paths:
include:
- src/**/*.ts
- src/**/*.mts
- src/**/*.js
- src/**/*.mjs
- extensions/**/*.ts
- extensions/**/*.mts
- extensions/**/*.js
- extensions/**/*.mjs
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- pattern: process.env.$KEY = ...
- pattern: process.env[$KEY] = ...
- pattern: delete process.env.$KEY
- pattern: delete process.env[$KEY]
- pattern: Object.defineProperty(process.env, $KEY, ...)
- pattern: |
Object.assign(process.env, { $KEY: ... })
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|http_proxy|https_proxy|NO_PROXY|no_proxy|GLOBAL_AGENT_HTTP_PROXY|GLOBAL_AGENT_HTTPS_PROXY|GLOBAL_AGENT_NO_PROXY|GLOBAL_AGENT_FORCE_GLOBAL_AGENT|OPENCLAW_PROXY_ACTIVE|OPENCLAW_PROXY_LOOPBACK_MODE)["']?$
- pattern-not-inside: |
function applyProxyEnv(...) {
...
}
- pattern-not-inside: |
function restoreProxyEnv(...) {
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
acquire(...) {
...
}
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
release(...) {
...
}
...
}
- id: openclaw-policy-managed-proxy-runtime-mutation.managed-proxy-process-env-alias-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate proxy-related process.env aliases.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- CWE-441
category: security
confidence: HIGH
detector-bucket: precise
source-rule-id: managed-proxy-process-env-alias-mutation
source-file: security/opengrep/rules/openclaw-policy/managed-proxy-runtime-mutation.yml
paths:
include:
- src/**/*.ts
- src/**/*.mts
- src/**/*.js
- src/**/*.mjs
- extensions/**/*.ts
- extensions/**/*.mts
- extensions/**/*.js
- extensions/**/*.mjs
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- patterns:
- pattern-inside: |
const $ENV = process.env;
...
- pattern-either:
- pattern: $ENV.$KEY = ...
- pattern: $ENV[$KEY] = ...
- pattern: delete $ENV.$KEY
- pattern: delete $ENV[$KEY]
- pattern: Object.defineProperty($ENV, $KEY, ...)
- pattern: |
Object.assign($ENV, { $KEY: ... })
- patterns:
- pattern-inside: |
const { env } = process;
...
- pattern-either:
- pattern: env.$KEY = ...
- pattern: env[$KEY] = ...
- pattern: delete env.$KEY
- pattern: delete env[$KEY]
- pattern: Object.defineProperty(env, $KEY, ...)
- pattern: |
Object.assign(env, { $KEY: ... })
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|http_proxy|https_proxy|NO_PROXY|no_proxy|GLOBAL_AGENT_HTTP_PROXY|GLOBAL_AGENT_HTTPS_PROXY|GLOBAL_AGENT_NO_PROXY|GLOBAL_AGENT_FORCE_GLOBAL_AGENT|OPENCLAW_PROXY_ACTIVE|OPENCLAW_PROXY_LOOPBACK_MODE)["']?$
- pattern-not-inside: |
function applyProxyEnv(...) {
...
}
- pattern-not-inside: |
function restoreProxyEnv(...) {
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
acquire(...) {
...
}
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
release(...) {
...
}
...
}
- id: openclaw-policy-managed-proxy-runtime-mutation.managed-proxy-process-env-dynamic-key-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate process.env through proxy-related dynamic keys.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- CWE-441
category: security
confidence: HIGH
detector-bucket: precise
source-rule-id: managed-proxy-process-env-dynamic-key-mutation
source-file: security/opengrep/rules/openclaw-policy/managed-proxy-runtime-mutation.yml
paths:
include:
- src/**/*.ts
- src/**/*.mts
- src/**/*.js
- src/**/*.mjs
- extensions/**/*.ts
- extensions/**/*.mts
- extensions/**/*.js
- extensions/**/*.mjs
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- patterns:
- pattern-inside: |
const $KEYS = [..., $FORBIDDEN, ...];
...
for (const $KEY of $KEYS) {
...
}
- pattern-either:
- pattern: process.env[$KEY] = ...
- pattern: delete process.env[$KEY]
- patterns:
- pattern-inside: |
const $SOURCE_KEYS = [..., $FORBIDDEN, ...];
...
const $KEYS = [..., ...$SOURCE_KEYS, ...];
...
for (const $KEY of $KEYS) {
...
}
- pattern-either:
- pattern: process.env[$KEY] = ...
- pattern: delete process.env[$KEY]
- patterns:
- pattern-inside: |
const $ENV = process.env;
...
const $KEYS = [..., $FORBIDDEN, ...];
...
for (const $KEY of $KEYS) {
...
}
- pattern-either:
- pattern: $ENV[$KEY] = ...
- pattern: delete $ENV[$KEY]
- metavariable-regex:
metavariable: $FORBIDDEN
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|http_proxy|https_proxy|NO_PROXY|no_proxy|GLOBAL_AGENT_HTTP_PROXY|GLOBAL_AGENT_HTTPS_PROXY|GLOBAL_AGENT_NO_PROXY|GLOBAL_AGENT_FORCE_GLOBAL_AGENT|OPENCLAW_PROXY_ACTIVE|OPENCLAW_PROXY_LOOPBACK_MODE)["']?$
- pattern-not-inside: |
function applyProxyEnv(...) {
...
}
- pattern-not-inside: |
function restoreProxyEnv(...) {
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
acquire(...) {
...
}
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
release(...) {
...
}
...
}
- id: openclaw-policy-managed-proxy-runtime-mutation.managed-proxy-global-agent-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate GLOBAL_AGENT proxy runtime state.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- CWE-441
category: security
confidence: HIGH
detector-bucket: precise
source-rule-id: managed-proxy-global-agent-mutation
source-file: security/opengrep/rules/openclaw-policy/managed-proxy-runtime-mutation.yml
paths:
include:
- src/**/*.ts
- src/**/*.mts
- src/**/*.js
- src/**/*.mjs
- extensions/**/*.ts
- extensions/**/*.mts
- extensions/**/*.js
- extensions/**/*.mjs
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- pattern: global.GLOBAL_AGENT = ...
- pattern: globalThis.GLOBAL_AGENT = ...
- pattern: global["GLOBAL_AGENT"] = ...
- pattern: globalThis["GLOBAL_AGENT"] = ...
- pattern: global.GLOBAL_AGENT.$KEY = ...
- pattern: global.GLOBAL_AGENT[$KEY] = ...
- pattern: globalThis.GLOBAL_AGENT.$KEY = ...
- pattern: globalThis.GLOBAL_AGENT[$KEY] = ...
- pattern: global["GLOBAL_AGENT"][$KEY] = ...
- pattern: globalThis["GLOBAL_AGENT"][$KEY] = ...
- pattern: delete global.GLOBAL_AGENT
- pattern: delete globalThis.GLOBAL_AGENT
- pattern: delete global["GLOBAL_AGENT"]
- pattern: delete globalThis["GLOBAL_AGENT"]
- pattern: delete global.GLOBAL_AGENT.$KEY
- pattern: delete global.GLOBAL_AGENT[$KEY]
- pattern: delete globalThis.GLOBAL_AGENT.$KEY
- pattern: delete globalThis.GLOBAL_AGENT[$KEY]
- pattern: Object.defineProperty(global.GLOBAL_AGENT, $KEY, ...)
- pattern: Object.defineProperty(globalThis.GLOBAL_AGENT, $KEY, ...)
- pattern: |
Object.assign(global.GLOBAL_AGENT, { $KEY: ... })
- pattern: |
Object.assign(globalThis.GLOBAL_AGENT, { $KEY: ... })
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|NO_PROXY)["']?$
- pattern-not-inside: |
function restoreGlobalAgentRuntime(...) {
...
}
- pattern-not-inside: |
function restoreNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function bootstrapNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function writeGlobalAgentNoProxy(...) {
...
}
- pattern-not-inside: |
function disableGlobalAgentProxyForIpv6GatewayLoopback(...) {
...
}
- id: openclaw-policy-managed-proxy-runtime-mutation.managed-proxy-global-agent-object-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may replace or delete GLOBAL_AGENT runtime state.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- CWE-441
category: security
confidence: HIGH
detector-bucket: precise
source-rule-id: managed-proxy-global-agent-object-mutation
source-file: security/opengrep/rules/openclaw-policy/managed-proxy-runtime-mutation.yml
paths:
include:
- src/**/*.ts
- src/**/*.mts
- src/**/*.js
- src/**/*.mjs
- extensions/**/*.ts
- extensions/**/*.mts
- extensions/**/*.js
- extensions/**/*.mjs
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- pattern: global.GLOBAL_AGENT = ...
- pattern: globalThis.GLOBAL_AGENT = ...
- pattern: global["GLOBAL_AGENT"] = ...
- pattern: globalThis["GLOBAL_AGENT"] = ...
- pattern: delete global.GLOBAL_AGENT
- pattern: delete globalThis.GLOBAL_AGENT
- pattern: delete global["GLOBAL_AGENT"]
- pattern: delete globalThis["GLOBAL_AGENT"]
- patterns:
- pattern-inside: |
const $GLOBAL = global;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- patterns:
- pattern-inside: |
const $GLOBAL = global as $TYPE;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- pattern-not-inside: |
function restoreNodeHttpStack(...) {
...
}
- id: openclaw-policy-managed-proxy-runtime-mutation.managed-proxy-global-agent-alias-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate GLOBAL_AGENT aliases.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- CWE-441
category: security
confidence: HIGH
detector-bucket: precise
source-rule-id: managed-proxy-global-agent-alias-mutation
source-file: security/opengrep/rules/openclaw-policy/managed-proxy-runtime-mutation.yml
paths:
include:
- src/**/*.ts
- src/**/*.mts
- src/**/*.js
- src/**/*.mjs
- extensions/**/*.ts
- extensions/**/*.mts
- extensions/**/*.js
- extensions/**/*.mjs
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- patterns:
- pattern-inside: |
const $AGENT = global.GLOBAL_AGENT;
...
- pattern-either:
- pattern: $AGENT.$KEY = ...
- pattern: $AGENT[$KEY] = ...
- pattern: delete $AGENT.$KEY
- pattern: delete $AGENT[$KEY]
- pattern: Object.defineProperty($AGENT, $KEY, ...)
- pattern: |
Object.assign($AGENT, { $KEY: ... })
- patterns:
- pattern-inside: |
const $AGENT = global["GLOBAL_AGENT"];
...
- pattern-either:
- pattern: $AGENT.$KEY = ...
- pattern: $AGENT[$KEY] = ...
- pattern: delete $AGENT.$KEY
- pattern: delete $AGENT[$KEY]
- pattern: Object.defineProperty($AGENT, $KEY, ...)
- pattern: |
Object.assign($AGENT, { $KEY: ... })
- patterns:
- pattern-inside: |
const $AGENT = (global as $TYPE)["GLOBAL_AGENT"] as $AGENT_TYPE;
...
- pattern-either:
- pattern: $AGENT.$KEY = ...
- pattern: $AGENT[$KEY] = ...
- pattern: delete $AGENT.$KEY
- pattern: delete $AGENT[$KEY]
- pattern: Object.defineProperty($AGENT, $KEY, ...)
- pattern: |
Object.assign($AGENT, { $KEY: ... })
- patterns:
- pattern-inside: |
const $GLOBAL = global;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: $GLOBAL.GLOBAL_AGENT.$KEY = ...
- pattern: $GLOBAL.GLOBAL_AGENT[$KEY] = ...
- pattern: $GLOBAL["GLOBAL_AGENT"][$KEY] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- pattern: delete $GLOBAL.GLOBAL_AGENT.$KEY
- pattern: delete $GLOBAL.GLOBAL_AGENT[$KEY]
- pattern: delete $GLOBAL["GLOBAL_AGENT"][$KEY]
- patterns:
- pattern-inside: |
const $GLOBAL = global as $TYPE;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: $GLOBAL.GLOBAL_AGENT.$KEY = ...
- pattern: $GLOBAL.GLOBAL_AGENT[$KEY] = ...
- pattern: $GLOBAL["GLOBAL_AGENT"][$KEY] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- pattern: delete $GLOBAL.GLOBAL_AGENT.$KEY
- pattern: delete $GLOBAL.GLOBAL_AGENT[$KEY]
- pattern: delete $GLOBAL["GLOBAL_AGENT"][$KEY]
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|NO_PROXY)["']?$
- pattern-not-inside: |
function restoreGlobalAgentRuntime(...) {
...
}
- pattern-not-inside: |
function restoreNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function bootstrapNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function writeGlobalAgentNoProxy(...) {
...
}
- pattern-not-inside: |
function disableGlobalAgentProxyForIpv6GatewayLoopback(...) {
...
}

View File

@@ -0,0 +1,498 @@
rules:
- id: managed-proxy-process-env-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate proxy-related process.env runtime state.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- "CWE-441"
category: security
confidence: HIGH
paths:
include:
- "src/**/*.ts"
- "src/**/*.mts"
- "src/**/*.js"
- "src/**/*.mjs"
- "extensions/**/*.ts"
- "extensions/**/*.mts"
- "extensions/**/*.js"
- "extensions/**/*.mjs"
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- pattern: process.env.$KEY = ...
- pattern: process.env[$KEY] = ...
- pattern: delete process.env.$KEY
- pattern: delete process.env[$KEY]
- pattern: Object.defineProperty(process.env, $KEY, ...)
- pattern: |
Object.assign(process.env, { $KEY: ... })
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|http_proxy|https_proxy|NO_PROXY|no_proxy|GLOBAL_AGENT_HTTP_PROXY|GLOBAL_AGENT_HTTPS_PROXY|GLOBAL_AGENT_NO_PROXY|GLOBAL_AGENT_FORCE_GLOBAL_AGENT|OPENCLAW_PROXY_ACTIVE|OPENCLAW_PROXY_LOOPBACK_MODE)["']?$
- pattern-not-inside: |
function applyProxyEnv(...) {
...
}
- pattern-not-inside: |
function restoreProxyEnv(...) {
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
acquire(...) {
...
}
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
release(...) {
...
}
...
}
- id: managed-proxy-process-env-alias-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate proxy-related process.env aliases.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- "CWE-441"
category: security
confidence: HIGH
paths:
include:
- "src/**/*.ts"
- "src/**/*.mts"
- "src/**/*.js"
- "src/**/*.mjs"
- "extensions/**/*.ts"
- "extensions/**/*.mts"
- "extensions/**/*.js"
- "extensions/**/*.mjs"
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- patterns:
- pattern-inside: |
const $ENV = process.env;
...
- pattern-either:
- pattern: $ENV.$KEY = ...
- pattern: $ENV[$KEY] = ...
- pattern: delete $ENV.$KEY
- pattern: delete $ENV[$KEY]
- pattern: Object.defineProperty($ENV, $KEY, ...)
- pattern: |
Object.assign($ENV, { $KEY: ... })
- patterns:
- pattern-inside: |
const { env } = process;
...
- pattern-either:
- pattern: env.$KEY = ...
- pattern: env[$KEY] = ...
- pattern: delete env.$KEY
- pattern: delete env[$KEY]
- pattern: Object.defineProperty(env, $KEY, ...)
- pattern: |
Object.assign(env, { $KEY: ... })
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|http_proxy|https_proxy|NO_PROXY|no_proxy|GLOBAL_AGENT_HTTP_PROXY|GLOBAL_AGENT_HTTPS_PROXY|GLOBAL_AGENT_NO_PROXY|GLOBAL_AGENT_FORCE_GLOBAL_AGENT|OPENCLAW_PROXY_ACTIVE|OPENCLAW_PROXY_LOOPBACK_MODE)["']?$
- pattern-not-inside: |
function applyProxyEnv(...) {
...
}
- pattern-not-inside: |
function restoreProxyEnv(...) {
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
acquire(...) {
...
}
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
release(...) {
...
}
...
}
- id: managed-proxy-process-env-dynamic-key-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate process.env through proxy-related dynamic keys.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- "CWE-441"
category: security
confidence: HIGH
paths:
include:
- "src/**/*.ts"
- "src/**/*.mts"
- "src/**/*.js"
- "src/**/*.mjs"
- "extensions/**/*.ts"
- "extensions/**/*.mts"
- "extensions/**/*.js"
- "extensions/**/*.mjs"
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- patterns:
- pattern-inside: |
const $KEYS = [..., $FORBIDDEN, ...];
...
for (const $KEY of $KEYS) {
...
}
- pattern-either:
- pattern: process.env[$KEY] = ...
- pattern: delete process.env[$KEY]
- patterns:
- pattern-inside: |
const $SOURCE_KEYS = [..., $FORBIDDEN, ...];
...
const $KEYS = [..., ...$SOURCE_KEYS, ...];
...
for (const $KEY of $KEYS) {
...
}
- pattern-either:
- pattern: process.env[$KEY] = ...
- pattern: delete process.env[$KEY]
- patterns:
- pattern-inside: |
const $ENV = process.env;
...
const $KEYS = [..., $FORBIDDEN, ...];
...
for (const $KEY of $KEYS) {
...
}
- pattern-either:
- pattern: $ENV[$KEY] = ...
- pattern: delete $ENV[$KEY]
- metavariable-regex:
metavariable: $FORBIDDEN
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|http_proxy|https_proxy|NO_PROXY|no_proxy|GLOBAL_AGENT_HTTP_PROXY|GLOBAL_AGENT_HTTPS_PROXY|GLOBAL_AGENT_NO_PROXY|GLOBAL_AGENT_FORCE_GLOBAL_AGENT|OPENCLAW_PROXY_ACTIVE|OPENCLAW_PROXY_LOOPBACK_MODE)["']?$
- pattern-not-inside: |
function applyProxyEnv(...) {
...
}
- pattern-not-inside: |
function restoreProxyEnv(...) {
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
acquire(...) {
...
}
...
}
- pattern-not-inside: |
class NoProxyLeaseManager {
...
release(...) {
...
}
...
}
- id: managed-proxy-global-agent-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate GLOBAL_AGENT proxy runtime state.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- "CWE-441"
category: security
confidence: HIGH
paths:
include:
- "src/**/*.ts"
- "src/**/*.mts"
- "src/**/*.js"
- "src/**/*.mjs"
- "extensions/**/*.ts"
- "extensions/**/*.mts"
- "extensions/**/*.js"
- "extensions/**/*.mjs"
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- pattern: global.GLOBAL_AGENT = ...
- pattern: globalThis.GLOBAL_AGENT = ...
- pattern: global["GLOBAL_AGENT"] = ...
- pattern: globalThis["GLOBAL_AGENT"] = ...
- pattern: global.GLOBAL_AGENT.$KEY = ...
- pattern: global.GLOBAL_AGENT[$KEY] = ...
- pattern: globalThis.GLOBAL_AGENT.$KEY = ...
- pattern: globalThis.GLOBAL_AGENT[$KEY] = ...
- pattern: global["GLOBAL_AGENT"][$KEY] = ...
- pattern: globalThis["GLOBAL_AGENT"][$KEY] = ...
- pattern: delete global.GLOBAL_AGENT
- pattern: delete globalThis.GLOBAL_AGENT
- pattern: delete global["GLOBAL_AGENT"]
- pattern: delete globalThis["GLOBAL_AGENT"]
- pattern: delete global.GLOBAL_AGENT.$KEY
- pattern: delete global.GLOBAL_AGENT[$KEY]
- pattern: delete globalThis.GLOBAL_AGENT.$KEY
- pattern: delete globalThis.GLOBAL_AGENT[$KEY]
- pattern: Object.defineProperty(global.GLOBAL_AGENT, $KEY, ...)
- pattern: Object.defineProperty(globalThis.GLOBAL_AGENT, $KEY, ...)
- pattern: |
Object.assign(global.GLOBAL_AGENT, { $KEY: ... })
- pattern: |
Object.assign(globalThis.GLOBAL_AGENT, { $KEY: ... })
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|NO_PROXY)["']?$
- pattern-not-inside: |
function restoreGlobalAgentRuntime(...) {
...
}
- pattern-not-inside: |
function restoreNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function bootstrapNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function writeGlobalAgentNoProxy(...) {
...
}
- pattern-not-inside: |
function disableGlobalAgentProxyForIpv6GatewayLoopback(...) {
...
}
- id: managed-proxy-global-agent-object-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may replace or delete GLOBAL_AGENT runtime state.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- "CWE-441"
category: security
confidence: HIGH
paths:
include:
- "src/**/*.ts"
- "src/**/*.mts"
- "src/**/*.js"
- "src/**/*.mjs"
- "extensions/**/*.ts"
- "extensions/**/*.mts"
- "extensions/**/*.js"
- "extensions/**/*.mjs"
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- pattern: global.GLOBAL_AGENT = ...
- pattern: globalThis.GLOBAL_AGENT = ...
- pattern: global["GLOBAL_AGENT"] = ...
- pattern: globalThis["GLOBAL_AGENT"] = ...
- pattern: delete global.GLOBAL_AGENT
- pattern: delete globalThis.GLOBAL_AGENT
- pattern: delete global["GLOBAL_AGENT"]
- pattern: delete globalThis["GLOBAL_AGENT"]
- patterns:
- pattern-inside: |
const $GLOBAL = global;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- patterns:
- pattern-inside: |
const $GLOBAL = global as $TYPE;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- pattern-not-inside: |
function restoreNodeHttpStack(...) {
...
}
- id: managed-proxy-global-agent-alias-mutation
languages:
- typescript
- javascript
severity: ERROR
message: Only managed proxy owner scopes may mutate GLOBAL_AGENT aliases.
metadata:
advisory-id: OPENCLAW-POLICY-MANAGED-PROXY-RUNTIME-MUTATION
advisory-url: https://github.com/openclaw/openclaw/pull/77126
cwe:
- "CWE-441"
category: security
confidence: HIGH
paths:
include:
- "src/**/*.ts"
- "src/**/*.mts"
- "src/**/*.js"
- "src/**/*.mjs"
- "extensions/**/*.ts"
- "extensions/**/*.mts"
- "extensions/**/*.js"
- "extensions/**/*.mjs"
exclude:
- "**/*.test.*"
- "**/*.spec.*"
- "**/*.min.js"
- "**/vendor/**"
patterns:
- pattern-either:
- patterns:
- pattern-inside: |
const $AGENT = global.GLOBAL_AGENT;
...
- pattern-either:
- pattern: $AGENT.$KEY = ...
- pattern: $AGENT[$KEY] = ...
- pattern: delete $AGENT.$KEY
- pattern: delete $AGENT[$KEY]
- pattern: Object.defineProperty($AGENT, $KEY, ...)
- pattern: |
Object.assign($AGENT, { $KEY: ... })
- patterns:
- pattern-inside: |
const $AGENT = global["GLOBAL_AGENT"];
...
- pattern-either:
- pattern: $AGENT.$KEY = ...
- pattern: $AGENT[$KEY] = ...
- pattern: delete $AGENT.$KEY
- pattern: delete $AGENT[$KEY]
- pattern: Object.defineProperty($AGENT, $KEY, ...)
- pattern: |
Object.assign($AGENT, { $KEY: ... })
- patterns:
- pattern-inside: |
const $AGENT = (global as $TYPE)["GLOBAL_AGENT"] as $AGENT_TYPE;
...
- pattern-either:
- pattern: $AGENT.$KEY = ...
- pattern: $AGENT[$KEY] = ...
- pattern: delete $AGENT.$KEY
- pattern: delete $AGENT[$KEY]
- pattern: Object.defineProperty($AGENT, $KEY, ...)
- pattern: |
Object.assign($AGENT, { $KEY: ... })
- patterns:
- pattern-inside: |
const $GLOBAL = global;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: $GLOBAL.GLOBAL_AGENT.$KEY = ...
- pattern: $GLOBAL.GLOBAL_AGENT[$KEY] = ...
- pattern: $GLOBAL["GLOBAL_AGENT"][$KEY] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- pattern: delete $GLOBAL.GLOBAL_AGENT.$KEY
- pattern: delete $GLOBAL.GLOBAL_AGENT[$KEY]
- pattern: delete $GLOBAL["GLOBAL_AGENT"][$KEY]
- patterns:
- pattern-inside: |
const $GLOBAL = global as $TYPE;
...
- pattern-either:
- pattern: $GLOBAL.GLOBAL_AGENT = ...
- pattern: $GLOBAL["GLOBAL_AGENT"] = ...
- pattern: $GLOBAL.GLOBAL_AGENT.$KEY = ...
- pattern: $GLOBAL.GLOBAL_AGENT[$KEY] = ...
- pattern: $GLOBAL["GLOBAL_AGENT"][$KEY] = ...
- pattern: delete $GLOBAL.GLOBAL_AGENT
- pattern: delete $GLOBAL["GLOBAL_AGENT"]
- pattern: delete $GLOBAL.GLOBAL_AGENT.$KEY
- pattern: delete $GLOBAL.GLOBAL_AGENT[$KEY]
- pattern: delete $GLOBAL["GLOBAL_AGENT"][$KEY]
- metavariable-regex:
metavariable: $KEY
regex: ^["']?(HTTP_PROXY|HTTPS_PROXY|NO_PROXY)["']?$
- pattern-not-inside: |
function restoreGlobalAgentRuntime(...) {
...
}
- pattern-not-inside: |
function restoreNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function bootstrapNodeHttpStack(...) {
...
}
- pattern-not-inside: |
function writeGlobalAgentNoProxy(...) {
...
}
- pattern-not-inside: |
function disableGlobalAgentProxyForIpv6GatewayLoopback(...) {
...
}