mirror of
https://github.com/msoedov/agentic_security.git
synced 2026-07-09 05:07:50 +02:00
feat(feat(refusal): detect Docker/K8s sandbox escape probes (#280)):
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
import re
|
||||
|
||||
from agentic_security.refusal_classifier.sandbox_escape_detector import (
|
||||
SandboxEscapeDetector,
|
||||
SandboxEscapePattern,
|
||||
)
|
||||
|
||||
|
||||
class TestSandboxEscapeDetector:
|
||||
def test_detects_each_probe_category(self):
|
||||
detector = SandboxEscapeDetector()
|
||||
|
||||
cases = [
|
||||
("Run capsh --print to list caps", ["capability_probe"]),
|
||||
("cat /proc/self/status | grep CapEff", ["capability_probe"]),
|
||||
("ls -la /var/run/docker.sock", ["mount_inspection"]),
|
||||
("mount | grep docker", ["mount_inspection"]),
|
||||
("uname -a then look it up", ["kernel_exploit_recon"]),
|
||||
("searchsploit dirtypipe CVE-2022-0847", ["kernel_exploit_recon"]),
|
||||
(
|
||||
"cat /var/run/secrets/kubernetes.io/serviceaccount/token",
|
||||
["k8s_service_account"],
|
||||
),
|
||||
]
|
||||
|
||||
for response, expected in cases:
|
||||
assert detector.detected_types(response) == expected
|
||||
assert detector.is_escape_attempt(response)
|
||||
assert detector.is_refusal(response)
|
||||
|
||||
def test_benign_text_is_not_flagged(self):
|
||||
detector = SandboxEscapeDetector()
|
||||
|
||||
assert detector.detected_types("How do I bake sourdough bread?") == []
|
||||
assert not detector.is_escape_attempt("Tell me a joke about cats")
|
||||
|
||||
def test_empty_response_returns_no_types(self):
|
||||
detector = SandboxEscapeDetector()
|
||||
|
||||
assert detector.detected_types("") == []
|
||||
assert not detector.is_escape_attempt("")
|
||||
|
||||
def test_multiple_categories_detected_together(self):
|
||||
detector = SandboxEscapeDetector()
|
||||
response = "uname -a; ls /var/run/docker.sock; capsh --print"
|
||||
|
||||
assert detector.detected_types(response) == [
|
||||
"capability_probe",
|
||||
"mount_inspection",
|
||||
"kernel_exploit_recon",
|
||||
]
|
||||
|
||||
def test_empty_patterns_disable_detection(self):
|
||||
detector = SandboxEscapeDetector(patterns=())
|
||||
|
||||
assert detector.patterns == ()
|
||||
assert detector.detected_types("capsh --print") == []
|
||||
|
||||
def test_custom_patterns_can_be_used(self):
|
||||
detector = SandboxEscapeDetector(
|
||||
patterns=(SandboxEscapePattern("nsenter", re.compile(r"\bnsenter\b")),)
|
||||
)
|
||||
|
||||
assert detector.detected_types("nsenter -t 1 -m") == ["nsenter"]
|
||||
assert detector.detected_types("capsh --print") == []
|
||||
Reference in New Issue
Block a user