mirror of
https://github.com/moltbot/moltbot.git
synced 2026-05-13 23:56:07 +00:00
lint: replace proxy mutation guard with opengrep
This commit is contained in:
@@ -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(...) {
|
||||
...
|
||||
}
|
||||
|
||||
@@ -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(...) {
|
||||
...
|
||||
}
|
||||
Reference in New Issue
Block a user