mboost-dp1
Python malware
- Forside
- ⟨
- Forum
- ⟨
- Tagwall
Når man pip installerer et Python modul kan setup koden tilgå alle de filer og foldere brugeren har rettigheder til, selvom man er i et python virtual environment. Et venv er ikke en sikkerhedsbarriere.
At installere og bruge et Python modul er (desværre) en tillidssag. Hvis man er interesseret i et modul der ikke er særlig velkendt eller udbredt, bør man lave noget seriøs research og tage et kig på koden før man kører en pip install.
Man kunne vel sætte et testing grounds python miljø op i en docker container eller VM, hvis man har et vist niveau af paranoia.
Men den eneste rigtige løsning er at indrette sig således at selv en worst case inficering af malware ikke vil kunne gøre uoprettelig skade. Altså ... hyppige, offline backups.
At installere og bruge et Python modul er (desværre) en tillidssag. Hvis man er interesseret i et modul der ikke er særlig velkendt eller udbredt, bør man lave noget seriøs research og tage et kig på koden før man kører en pip install.
Man kunne vel sætte et testing grounds python miljø op i en docker container eller VM, hvis man har et vist niveau af paranoia.
Men den eneste rigtige løsning er at indrette sig således at selv en worst case inficering af malware ikke vil kunne gøre uoprettelig skade. Altså ... hyppige, offline backups.
#2
Jeg kender kun en teknologi som kan forhindre den slags og de har deprecated funktionaliteten og vil fjerne den.
C:\Work\Java>type Something.java
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Something {
public static void something() {
try {
String urlstr = "http://arne1.vajhoej.dk/index.html";
String fnm = "index.html";
URL url = new URL(urlstr);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.connect();
if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream is = con.getInputStream();
OutputStream os = new FileOutputStream(fnm);
byte[] b = new byte[100000];
int n;
while((n = is.read(b)) >= 0) {
os.write(b,0,n);
}
os.close();
is.close();
}
con.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
C:\Work\Java>javac Something.java
C:\Work\Java>jar cvf something.jar Something.class
added manifest
adding: Something.class(in = 1161) (out= 753)(deflated 35%)
C:\Work\Java>type Test.java
public class Test {
public static void main(String[] args) {
Something.something();
System.out.println("Something is done");
}
}
C:\Work\Java>javac -cp something.jar Test.java
C:\Work\Java>del index.html
C:\Work\Java>java -cp .;something.jar Test
Something is done
C:\Work\Java>type empty.policy
grant {
};
C:\Work\Java>del index.html
C:\Work\Java>java -Djava.security.manager -Djava.security.policy=empty.policy -cp .;something.jar Test
WARNING: A command line option has enabled the Security Manager
WARNING: The Security Manager is deprecated and will be removed in a future release
Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "arne1.vajhoej.dk:80" "connect,resolve")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:485)
at java.base/java.security.AccessController.checkPermission(AccessController.java:1068)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:416)
at java.base/java.lang.SecurityManager.checkConnect(SecurityManager.java:919)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:619)
at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:279)
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:384)
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:406)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1309)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1242)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1128)
at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1057)
at Something.something(Something.java:16)
at Test.main(Test.java:3)
C:\Work\Java>type net.policy
grant {
permission java.net.SocketPermission "arne1.vajhoej.dk", "connect,resolve";
};
C:\Work\Java>del index.html
Could Not Find C:\Work\Java\index.html
C:\Work\Java>java -Djava.security.manager -Djava.security.policy=net.policy -cp .;something.jar Test
WARNING: A command line option has enabled the Security Manager
WARNING: The Security Manager is deprecated and will be removed in a future release
Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "index.html" "write")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:485)
at java.base/java.security.AccessController.checkPermission(AccessController.java:1068)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:416)
at java.base/java.lang.SecurityManager.checkWrite(SecurityManager.java:847)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:223)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:123)
at Something.something(Something.java:19)
at Test.main(Test.java:3)
C:\Work\Java>type net_and_disk.policy
grant {
permission java.net.SocketPermission "arne1.vajhoej.dk", "connect,resolve";
permission java.io.FilePermission "index.html", "write";
};
C:\Work\Java>del index.html
Could Not Find C:\Work\Java\index.html
C:\Work\Java>java -Djava.security.manager -Djava.security.policy=net_and_disk.policy -cp .;something.jar Test
WARNING: A command line option has enabled the Security Manager
WARNING: The Security Manager is deprecated and will be removed in a future release
Something is done
Jeg kender kun en teknologi som kan forhindre den slags og de har deprecated funktionaliteten og vil fjerne den.
C:\Work\Java>type Something.java
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Something {
public static void something() {
try {
String urlstr = "http://arne1.vajhoej.dk/index.html";
String fnm = "index.html";
URL url = new URL(urlstr);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.connect();
if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream is = con.getInputStream();
OutputStream os = new FileOutputStream(fnm);
byte[] b = new byte[100000];
int n;
while((n = is.read(b)) >= 0) {
os.write(b,0,n);
}
os.close();
is.close();
}
con.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
C:\Work\Java>javac Something.java
C:\Work\Java>jar cvf something.jar Something.class
added manifest
adding: Something.class(in = 1161) (out= 753)(deflated 35%)
C:\Work\Java>type Test.java
public class Test {
public static void main(String[] args) {
Something.something();
System.out.println("Something is done");
}
}
C:\Work\Java>javac -cp something.jar Test.java
C:\Work\Java>del index.html
C:\Work\Java>java -cp .;something.jar Test
Something is done
C:\Work\Java>type empty.policy
grant {
};
C:\Work\Java>del index.html
C:\Work\Java>java -Djava.security.manager -Djava.security.policy=empty.policy -cp .;something.jar Test
WARNING: A command line option has enabled the Security Manager
WARNING: The Security Manager is deprecated and will be removed in a future release
Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "arne1.vajhoej.dk:80" "connect,resolve")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:485)
at java.base/java.security.AccessController.checkPermission(AccessController.java:1068)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:416)
at java.base/java.lang.SecurityManager.checkConnect(SecurityManager.java:919)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:619)
at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:279)
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:384)
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:406)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1309)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1242)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1128)
at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1057)
at Something.something(Something.java:16)
at Test.main(Test.java:3)
C:\Work\Java>type net.policy
grant {
permission java.net.SocketPermission "arne1.vajhoej.dk", "connect,resolve";
};
C:\Work\Java>del index.html
Could Not Find C:\Work\Java\index.html
C:\Work\Java>java -Djava.security.manager -Djava.security.policy=net.policy -cp .;something.jar Test
WARNING: A command line option has enabled the Security Manager
WARNING: The Security Manager is deprecated and will be removed in a future release
Exception in thread "main" java.security.AccessControlException: access denied ("java.io.FilePermission" "index.html" "write")
at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:485)
at java.base/java.security.AccessController.checkPermission(AccessController.java:1068)
at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:416)
at java.base/java.lang.SecurityManager.checkWrite(SecurityManager.java:847)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:223)
at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:123)
at Something.something(Something.java:19)
at Test.main(Test.java:3)
C:\Work\Java>type net_and_disk.policy
grant {
permission java.net.SocketPermission "arne1.vajhoej.dk", "connect,resolve";
permission java.io.FilePermission "index.html", "write";
};
C:\Work\Java>del index.html
Could Not Find C:\Work\Java\index.html
C:\Work\Java>java -Djava.security.manager -Djava.security.policy=net_and_disk.policy -cp .;something.jar Test
WARNING: A command line option has enabled the Security Manager
WARNING: The Security Manager is deprecated and will be removed in a future release
Something is done
#3 En security manager, der kan begrænse adgang til filer og netværk. Det giver god mening. Der kommer nok desværre mere og mere behov for den slags.
Jeg googlede om python har noget tilsvarende, og der dukkede denne op: https://github.com/google/python-security-manager men, som de skriver kan dens begrænsninger forbigås ret nemt, så det ligner mere noget legetøj end rigtig sikkerhed.
Jeg tror fremtiden bliver mere og mere sandboxing af både apps og udviklingsmiljøer. Android's apps har været ganske robust sandboxede fra starten af. Ubuntus snap system forsøger på noget lignende. Hvorfor ikke sandboxe udviklingsmiljøer, som f.eks. pythons virtual environment. Det kunne gøres med en docker i Linux verdenen.
Begrænsning af netværksadgang kan så gøres i forbindelse med dockerens virtuelle netværkskort.
Men alt dette er bare møg besværligt og begrænser frihederne når man udvikler, så jeg tror de fleste udviklere bare giver den gas og kører uden sikkerhedssele. Det går jo også fint nok det meste af tiden...
Jeg googlede om python har noget tilsvarende, og der dukkede denne op: https://github.com/google/python-security-manager men, som de skriver kan dens begrænsninger forbigås ret nemt, så det ligner mere noget legetøj end rigtig sikkerhed.
Jeg tror fremtiden bliver mere og mere sandboxing af både apps og udviklingsmiljøer. Android's apps har været ganske robust sandboxede fra starten af. Ubuntus snap system forsøger på noget lignende. Hvorfor ikke sandboxe udviklingsmiljøer, som f.eks. pythons virtual environment. Det kunne gøres med en docker i Linux verdenen.
Begrænsning af netværksadgang kan så gøres i forbindelse med dockerens virtuelle netværkskort.
Men alt dette er bare møg besværligt og begrænser frihederne når man udvikler, så jeg tror de fleste udviklere bare giver den gas og kører uden sikkerhedssele. Det går jo også fint nok det meste af tiden...
larsp (4) skrev:
En security manager, der kan begrænse adgang til filer og netværk. Det giver god mening. Der kommer nok desværre mere og mere behov for den slags.
Mere behov.
Færre muligheder.
Jeg kender ikke andre end Java med den. Og Java deprecatede den i Java 17.
:-(
larsp (4) skrev:
Jeg tror fremtiden bliver mere og mere sandboxing af både apps og udviklingsmiljøer. Android's apps har været ganske robust sandboxede fra starten af. Ubuntus snap system forsøger på noget lignende. Hvorfor ikke sandboxe udviklingsmiljøer, som f.eks. pythons virtual environment. Det kunne gøres med en docker i Linux verdenen.
Begrænsning af netværksadgang kan så gøres i forbindelse med dockerens virtuelle netværkskort.
En applikations sandbox er god.
En VM/container/jail sandbox er bedre end ingenting, men ikke så god som en applikations sandbox. Fordi hvis det der laves i den VM/container/jail sandbox har noget værdi skal der jo på et tidspunkt flyttes noget ud af den.
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.