skills-experimental/dangerous-permission-detection/SKILL.md
# Dangerous Permission Detection Skill Dangerous Permission Detection - isDangerousBashPermission python:* + isDangerousPowerShellPermission iex:* + isDangerousTaskPermission Agent allow + findDangerousClassifierPermissions + DANGEROUS_BASH_PATTERNS + CROSS_PLATFORM_CODE_EXEC + stripDangerousPermissionsForAutoMode + restoreDangerousPermissions stash + transitionPermissionMode。 ## 功能概述 从Claude Code的utils/permissions/permissionSetup.ts提取的Dangerous permission detection模式,用于OpenClaw的auto mode危险权限
npx skillsauth add bianhaifeng789-hue/openclaw-config skills-experimental/dangerous-permission-detectionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Dangerous Permission Detection - isDangerousBashPermission python:* + isDangerousPowerShellPermission iex:* + isDangerousTaskPermission Agent allow + findDangerousClassifierPermissions + DANGEROUS_BASH_PATTERNS + CROSS_PLATFORM_CODE_EXEC + stripDangerousPermissionsForAutoMode + restoreDangerousPermissions stash + transitionPermissionMode。
从Claude Code的utils/permissions/permissionSetup.ts提取的Dangerous permission detection模式,用于OpenClaw的auto mode危险权限检测。
export function isDangerousBashPermission(toolName: string, ruleContent: string | undefined): boolean {
if (toolName !== BASH_TOOL_NAME) return false
// Tool-level allow (Bash with no content, or Bash(*)) - allows ALL commands
if (ruleContent === undefined || ruleContent === '') return true
if (content === '*') return true
// Check for dangerous patterns with prefix syntax (e.g., "python:*")
for (const pattern of DANGEROUS_BASH_PATTERNS) {
if (content === `${lowerPattern}:*`) return true // python:* allows any python command
if (content === `${lowerPattern}*`) return true // python* matches python, python3
if (content === `${lowerPattern} *`) return true // python * matches "python script.py"
if (content.startsWith(`${lowerPattern} -`) && content.endsWith('*')) return true // python -* matches "python -c 'code'"
}
return false
}
// isDangerousBashPermission
# python:* → dangerous
# node:* → dangerous
# interpreter patterns
# bypass classifier
export function isDangerousPowerShellPermission(toolName: string, ruleContent: string | undefined): boolean {
if (toolName !== POWERSHELL_TOOL_NAME) return false
// Tool-level allow - allows ALL commands
if (ruleContent === undefined || ruleContent === '') return true
if (content === '*') return true
const patterns: readonly string[] = [
...CROSS_PLATFORM_CODE_EXEC,
'pwsh', 'powershell', 'cmd', 'wsl',
'iex', 'invoke-expression', 'icm', 'invoke-command',
'start-process', 'saps', 'start', 'start-job', 'sajb',
// ... more patterns
]
for (const pattern of patterns) {
if (content === pattern) return true
if (content === `${pattern}:*`) return true
// ...
}
return false
}
// isDangerousPowerShellPermission
# iex:* → dangerous
# invoke-expression:* → dangerous
# start-process:* → dangerous
# PowerShell-specific patterns
export function isDangerousTaskPermission(toolName: string, _ruleContent: string | undefined): boolean {
return normalizeLegacyToolName(toolName) === AGENT_TOOL_NAME
}
// isDangerousTaskPermission
# Agent allow → dangerous
# Bypass classifier sub-agent evaluation
# Delegation attack prevention
export function findDangerousClassifierPermissions(rules: PermissionRule[], cliAllowedTools: string[]): DangerousPermissionInfo[] {
const dangerous: DangerousPermissionInfo[] = []
// Check rules loaded from settings
for (const rule of rules) {
if (rule.ruleBehavior === 'allow' &&
isDangerousClassifierPermission(rule.ruleValue.toolName, rule.ruleValue.ruleContent)) {
dangerous.push({
ruleValue: rule.ruleValue,
source: rule.source,
ruleDisplay: ruleString,
sourceDisplay: formatPermissionSource(rule.source),
})
}
}
// Check CLI --allowed-tools arguments
for (const toolSpec of cliAllowedTools) {
// Parse tool spec: "Bash" or "Bash(pattern)"
// ...
}
return dangerous
}
// findDangerousClassifierPermissions
# Check settings rules
# Check CLI args
# Return structured info
// Dangerous patterns for Bash
DANGEROUS_BASH_PATTERNS: [
'python', 'python3', 'node', 'npm', 'npx',
'bash', 'sh', 'zsh', 'fish',
'ruby', 'perl', 'php',
// ... interpreters
]
// DANGEROUS_BASH_PATTERNS
# Script interpreters
# Execute arbitrary code
# Bypass classifier
CROSS_PLATFORM_CODE_EXEC: [
'curl', 'wget', 'fetch', // download-and-execute
'eval', 'exec', // code execution
// ... shared with PowerShell
]
// CROSS_PLATFORM_CODE_EXEC
# Shared patterns
# Bash + PowerShell
# Code execution
export function stripDangerousPermissionsForAutoMode(context: ToolPermissionContext): ToolPermissionContext {
const rules: PermissionRule[] = []
// ... collect rules from context
const dangerousPermissions = findDangerousClassifierPermissions(rules, [])
if (dangerousPermissions.length === 0) {
return { ...context, strippedDangerousRules: context.strippedDangerousRules ?? {} }
}
for (const permission of dangerousPermissions) {
logForDebugging(`Ignoring dangerous permission ${permission.ruleDisplay} from ${permission.sourceDisplay} (bypasses classifier)`)
}
// Stash removed rules
const stripped: ToolPermissionRulesBySource = {}
for (const perm of dangerousPermissions) {
if (!isPermissionUpdateDestination(perm.source)) continue
;(stripped[perm.source] ??= []).push(permissionRuleValueToString(perm.ruleValue))
}
return {
...removeDangerousPermissions(context, dangerousPermissions),
strippedDangerousRules: stripped,
}
}
// stripDangerousPermissionsForAutoMode
# Remove dangerous rules
# Stash removed rules
# Log warnings
export function restoreDangerousPermissions(context: ToolPermissionContext): ToolPermissionContext {
const stash = context.strippedDangerousRules
if (!stash) return context
let result = context
for (const [source, ruleStrings] of Object.entries(stash)) {
if (!ruleStrings || ruleStrings.length === 0) continue
result = applyPermissionUpdate(result, {
type: 'addRules',
rules: ruleStrings.map(permissionRuleValueFromString),
behavior: 'allow',
destination: source as PermissionUpdateDestination,
})
}
return { ...result, strippedDangerousRules: undefined }
}
// restoreDangerousPermissions
# Restore from stash
# Re-add rules
# Clear stash
export function transitionPermissionMode(fromMode: string, toMode: string, context: ToolPermissionContext): ToolPermissionContext {
if (fromMode === toMode) return context
// ... plan/auto transitions
if (feature('TRANSCRIPT_CLASSIFIER')) {
const fromUsesClassifier = fromMode === 'auto' || (fromMode === 'plan' && isAutoModeActive())
const toUsesClassifier = toMode === 'auto'
if (toUsesClassifier && !fromUsesClassifier) {
if (!isAutoModeGateEnabled()) {
throw new Error('Cannot transition to auto mode: gate is not enabled')
}
setAutoModeActive(true)
context = stripDangerousPermissionsForAutoMode(context)
} else if (fromUsesClassifier && !toUsesClassifier) {
setAutoModeActive(false)
setNeedsAutoModeExitAttachment(true)
context = restoreDangerousPermissions(context)
}
}
return context
}
// transitionPermissionMode
# Strip on enter
# Restore on exit
# State transitions
{
"dangerous": ["Bash(python:*)", "PowerShell(iex:*)", "Agent"],
"stripped": {"userSettings": ["Bash(npm:*)"]}
}
python:* | node:* | bash:* → interpreter prefix → allows arbitrary code → dangerous → bypass classifier
# interpreter prefix patterns dangerous
# python:* → dangerous
# node:* → dangerous
iex:* | invoke-expression:* | start-process:* → PowerShell specific → code execution → dangerous → bypass classifier
# PowerShell iex/start-process dangerous
# iex:* → dangerous
# invoke-expression:* → dangerous
Agent allow rule → bypass classifier sub-agent evaluation → delegation attack prevention → dangerous → Task permission
# Agent allow bypasses sub-agent eval
# bypass classifier
# delegation attack
enter auto → stripDangerousPermissionsForAutoMode → stash → exit auto → restoreDangerousPermissions → clear stash → strip/restore pattern
# strip on enter, restore on exit
# stash removed rules
# restore on exit
default → auto: strip | auto → default: restore | plan → auto: strip | auto → plan: keep → transitionPermissionMode → state machine
# mode transition state machine
# strip on auto enter
# restore on auto exit
utils/permissions/permissionSetup.ts (771 lines)business
IAA 日报飞书输出能力。 支持把固定 CSV 模板一键转换成: - 中文运营结论 - 飞书卡片 JSON - 飞书发送载荷 Use when: - 需要把 IAA 日报直接发到飞书 - 需要从 CSV 一键生成运营日报
data-ai
IAA日报分析模型 功能: - 渠道日报自动分析 - 小时级+日级ROI联动判断 - 按地区输出加量/降量/停投建议 - 按产品类型输出阈值 - 自动识别利润区/观察区/止损区 Use when: - 分析每天投放数据 - 生成运营日报结论 - 判断是否加量/降量/停投 - 对比美加澳/日韩表现 Keywords: - 日报模型, 投放日报, 加量, 降量, 停投, ROI日报, 分地区分析
data-ai
IAA固定日报分析模板 功能: - 固定字段模板(可直接贴每天数据) - 自动输出总盘结论 - 自动输出美加澳/日韩结论 - 自动给出加量/降量/停投建议 - 适配文件修复/清理两类产品 Use when: - 需要固定日报格式 - 每天复盘渠道表现 - 给运营团队出统一结论 Keywords: - 固定模板, 日报模板, ROI模板, IAA日报, 运营模板
development
# HyperlinkPool Pattern Skill HyperlinkPool Pattern - HyperlinkPool class + strings array + stringMap + Index 0 no hyperlink + intern(hyperlink) + get(id) + undefined handling + 5-minute reset + OSC8 hyperlink interning。 ## 功能概述 从Claude Code的ink/screen.ts提取的HyperlinkPool模式,用于OpenClaw的OSC8超链接池管理。 ## 核心机制 ### HyperlinkPool Class ```typescript export class HyperlinkPool { private strings: string[] = [''] // Index 0 = no hyperlink private stringMap = new Map<string, number>() // strings