+ "details": "### Summary\n[zeptoclaw](https://github.com/qhkm/zeptoclaw) implements a [blocklist](https://github.com/qhkm/zeptoclaw/blob/fe2ef07cfec5bb46b42cdd65f52b9230c03e9270/src/tools/android/actions.rs#L413-L424) to prevent dangerous commands running in android device shell, but this blocklist has several blocked commands with argements in the pattern literal, such as `rm -f` and `rm -rf`, this can be simply bypassed by using different orders for these arguments, such as `rm -r -f` or `rm -fr` etc.\n\n### Details\nAs in code [src/tools/android/actions.rs#L413-L424](https://github.com/qhkm/zeptoclaw/blob/fe2ef07cfec5bb46b42cdd65f52b9230c03e9270/src/tools/android/actions.rs#L413-L424), we can see the `rm -f` and `rm -rf` are hard coded and thus can be simply bypassed via `rm -r -f` or `rm -fr` etc.\n```rust\npub async fn device_shell(adb: &AdbExecutor, cmd: &str) -> Result<String> {\n // Normalize whitespace for blocklist check\n let normalized: String = cmd.split_whitespace().collect::<Vec<_>>().join(\" \");\n let lower = normalized.to_lowercase();\n\n let blocked = [\n \"rm -rf\",\n \"rm -r\",\n \"reboot\",\n \"factory_reset\",\n \"wipe\",\n \"format\",\n \"dd if=\",\n \"mkfs\",\n \"flash\",\n \"fastboot\",\n ];\n for pattern in &blocked {\n if lower.contains(pattern) {\n return Err(ZeptoError::Tool(format!(\n \"Blocked dangerous command containing '{}'\",\n pattern\n )));\n }\n }\n```\n\n### PoC\nSet up [zeptoclaw](https://github.com/qhkm/zeptoclaw) with an Android tool and then run the command `rm -f -r` etc.\n\n### Impact\nUnauthorized command executed in Android device.\n\n### Credit\n[@zpbrent](https://github.com/zpbrent)",
0 commit comments