-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexecutor_security.py
More file actions
75 lines (65 loc) · 2.95 KB
/
executor_security.py
File metadata and controls
75 lines (65 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""
Moduł bezpieczeństwa - sprawdzanie czy komenda jest niebezpieczna.
"""
import re
def is_dangerous_command(cmd):
"""Sprawdza czy komenda odnosi się do ścieżek/operacji uznanych za groźne."""
# Ścieżki systemowe
dangerous_paths = [
'/etc', '/usr', '/bin', '/sbin', '/var', '/proc', '/sys', '/dev', '/root', '~'
]
cmd_lower = cmd.lower()
# Sprawdź path traversal - tylko w ścieżkach (poprzedzone spacją, / lub na początku)
# Wyklucza false positive dla np. "echo '..'" lub "git log --oneline"
if re.search(r'(?:^|\s|/|\'|")\.\.(?:$|[\s/\'"])', cmd):
return True
for path in dangerous_paths:
# Sprawdzamy czy ścieżka występuje jako osobny "token" lub początek ścieżki
# tzn. poprzedzona spacją lub będąca na początku, i zakończona spacją, slashem lub końcem linii
pattern = rf"(^|\s){re.escape(path)}($|[\s/])"
if re.search(pattern, cmd_lower):
return True
# Potencjalnie groźne modyfikatory plików poza projektem
if 'rm ' in cmd_lower or 'chmod ' in cmd_lower or 'chown ' in cmd_lower:
return True
# Rozszerzona lista niebezpiecznych komend
dangerous_commands = [
# Modyfikatory plików/systemu
'rm ', 'chmod ', 'chown ', 'dd', 'mkfs', 'fdisk', 'parted',
# Zarządzanie systemem
'shutdown', 'reboot', 'halt', 'poweroff', 'systemctl',
# Procesy
'kill ', 'pkill', 'killall',
# Eksfiltracja danych / sieci
'curl ', 'wget ', 'nc ', 'netcat', 'scp ', 'rsync',
# Wykonywanie kodu / injection
'python', 'python3', 'perl ', 'ruby ', 'node ', 'php ',
'eval ', 'exec ', 'source ',
# Uprawnienia
'sudo ', 'su ', 'doas ',
# Sieć/firewall
'iptables', 'firewall-cmd', 'ufw',
# Automatyzacja/zadania
'crontab', 'at ',
# Zarządzanie użytkownikami
'useradd', 'userdel', 'usermod', 'passwd',
# Inne niebezpieczne
'mv /', 'cp /', 'cat /etc/', 'vim /etc/', 'nano /etc/',
'>', '>>', '|', '&&', '||', # przekierowania i łańcuchy komend
]
for dangerous in dangerous_commands:
# Zabezpieczenie przed substringami (np. 'at' w 'cat')
# Używamy regex, aby sprawdzić czy komenda występuje jako osobny token
# Wyjątek dla operatorów przekierowań i potoków
if dangerous in ['>', '>>', '|', '&&', '||']:
if dangerous in cmd_lower:
return True
continue
# Sprawdzamy czy fraza występuje na początku lub po spacji,
# oraz kończy się spacją, slashem lub końcem linii
# Przycinamy 'dangerous' z białych znaków, bo regex sam obsłuży granice
clean_dangerous = dangerous.strip()
pattern = rf"(^|\s){re.escape(clean_dangerous)}($|[\s/])"
if re.search(pattern, cmd_lower):
return True
return False