@@ -5,25 +5,75 @@ import { defineTool } from "./base.ts";
55 * Dangerous command patterns that should be blocked for safety.
66 * These patterns match commands that could cause severe system damage.
77 */
8- const DANGEROUS_PATTERNS = [
9- // Recursive deletion of root or important directories
10- / r m \s + ( - [ a - z A - Z ] * f [ a - z A - Z ] * \s + ) ? ( - [ a - z A - Z ] * r [ a - z A - Z ] * \s + ) ? [ \/ ~ ] \s * $ / i,
11- / r m \s + ( - [ a - z A - Z ] * r [ a - z A - Z ] * \s + ) ? ( - [ a - z A - Z ] * f [ a - z A - Z ] * \s + ) ? [ \/ ~ ] \s * $ / i,
12- / r m \s + - r f \s + \/ \s * $ / i,
13- / r m \s + - r f \s + \/ \* / i,
8+ const DANGEROUS_PATTERNS : Array < { pattern : RegExp ; reason : string } > = [
9+ // Recursive deletion of root, home, or current directory
10+ // Matches: rm -rf /, rm -rf ~, rm -rf ./, rm -rf ., etc.
11+ {
12+ pattern : / r m \s + ( - [ a - z A - Z ] * \s + ) * [ " ' ] ? ( [ / ~ ] | \. \. ? \/ ? ) [ " ' ] ? \s * $ / i,
13+ reason : "Recursive deletion of root, home, or current directory" ,
14+ } ,
15+ {
16+ pattern : / r m \s + ( - [ a - z A - Z ] * \s + ) * [ " ' ] ? \/ \* [ " ' ] ? / i,
17+ reason : "Recursive deletion of root contents" ,
18+ } ,
19+ // rm -rf * or rm -rf ./* (deletes everything in current directory)
20+ // Matches rm with -r flag (recursive) followed by wildcard
21+ {
22+ pattern : / r m \s + ( - \w + \s + ) * [ " ' ] ? \* [ " ' ] ? \s * $ / i,
23+ reason : "Deletion with wildcard - potentially dangerous" ,
24+ } ,
1425 // Fork bomb patterns
15- / : \s * \( \s * \) \s * \{ \s * : \s * \| \s * : \s * & \s * \} \s * ; ? \s * : / ,
26+ {
27+ pattern : / : \s * \( \s * \) \s * \{ \s * : \s * \| \s * : \s * & \s * \} \s * ; ? \s * : / ,
28+ reason : "Fork bomb detected" ,
29+ } ,
1630 // Overwriting boot records or critical system files
17- / > \s * \/ d e v \/ s d [ a - z ] / i,
18- / d d \s + .* o f = \/ d e v \/ s d [ a - z ] / i,
19- / m k f s \s + .* \/ d e v \/ s d [ a - z ] / i,
20- // Chmod 777 on root
21- / c h m o d \s + ( - [ a - z A - Z ] * R [ a - z A - Z ] * \s + ) ? 7 7 7 \s + \/ \s * $ / i,
22- // Dangerous redirects
23- / > \s * \/ d e v \/ n u l l \s * 2 > & 1 \s * < \s * \/ d e v \/ n u l l / ,
31+ {
32+ pattern : / > \s * \/ d e v \/ s d [ a - z ] / i,
33+ reason : "Writing to block device" ,
34+ } ,
35+ {
36+ pattern : / d d \s + .* o f = \/ d e v \/ s d [ a - z ] / i,
37+ reason : "dd to block device" ,
38+ } ,
39+ {
40+ pattern : / m k f s \s + .* \/ d e v \/ s d [ a - z ] / i,
41+ reason : "Formatting block device" ,
42+ } ,
43+ // Chmod 777 on root or recursive on sensitive paths
44+ {
45+ pattern : / c h m o d \s + ( - [ a - z A - Z ] * \s + ) * 7 7 7 \s + [ " ' ] ? [ / ~ ] [ " ' ] ? \s * $ / i,
46+ reason : "chmod 777 on root or home directory" ,
47+ } ,
48+ // Dangerous redirects that could hang the shell
49+ {
50+ pattern : / > \s * \/ d e v \/ n u l l \s * 2 > & 1 \s * < \s * \/ d e v \/ n u l l / ,
51+ reason : "Dangerous redirect pattern" ,
52+ } ,
2453 // Kill all processes
25- / k i l l \s + - 9 \s + - 1 / ,
26- / k i l l a l l \s + - 9 \s + / ,
54+ {
55+ pattern : / k i l l \s + - 9 \s + - 1 / ,
56+ reason : "Killing all processes" ,
57+ } ,
58+ {
59+ pattern : / k i l l a l l \s + - 9 \s + / ,
60+ reason : "Killing all processes by name" ,
61+ } ,
62+ // Prevent sudo with dangerous commands
63+ {
64+ pattern : / s u d o \s + r m \s + ( - [ a - z A - Z ] * \s + ) * [ " ' ] ? [ / ~ ] [ " ' ] ? \s * $ / i,
65+ reason : "sudo rm on root or home directory" ,
66+ } ,
67+ // Prevent overwriting /etc/passwd, /etc/shadow, etc.
68+ {
69+ pattern : / > \s * \/ e t c \/ ( p a s s w d | s h a d o w | s u d o e r s ) / i,
70+ reason : "Overwriting critical system file" ,
71+ } ,
72+ // Prevent writing to /boot or /sys
73+ {
74+ pattern : / > \s * \/ ( b o o t | s y s ) \/ / i,
75+ reason : "Writing to critical system directory" ,
76+ } ,
2777] ;
2878
2979/**
@@ -32,11 +82,11 @@ const DANGEROUS_PATTERNS = [
3282function isDangerousCommand ( command : string ) : { dangerous : boolean ; reason ?: string } {
3383 const trimmed = command . trim ( ) ;
3484
35- for ( const pattern of DANGEROUS_PATTERNS ) {
85+ for ( const { pattern, reason } of DANGEROUS_PATTERNS ) {
3686 if ( pattern . test ( trimmed ) ) {
3787 return {
3888 dangerous : true ,
39- reason : `Command matches dangerous pattern: ${ pattern . toString ( ) } ` ,
89+ reason,
4090 } ;
4191 }
4292 }
0 commit comments