# Java vs. Sandbox



## JavaEngel (18. August 2008)

Hallo liebe Java-Entwikler,

Also erstmal möchte ich euch sagen das Ihr euch für die schönste Sprache entschieden habt ^^

*Meine Frage:*
Kann ich mit Java erkennen ob mein Programm in einer Sandbox läuft?


Danke ;-)


----------



## Looky (19. August 2008)

Mhm, ich würd einfach irgendeinen Zugriff machen, den du nur darfst wenn du außerhalb der eigentlichen Sandbox bist. Bekommst du eine AccessControllException weißt du Bescheid.

Vielleicht gibts ja noch schönere Möglichkeiten, für sowas ist dann meist Thomas verantwortlich 

Chriz


----------



## JavaEngel (19. August 2008)

Looky hat gesagt.:


> Mhm, ich würd einfach irgendeinen Zugriff machen, den du nur darfst wenn du außerhalb der eigentlichen Sandbox bist. Bekommst du eine AccessControllException weißt du Bescheid.
> 
> Vielleicht gibts ja noch schönere Möglichkeiten, für sowas ist dann meist Thomas verantwortlich
> 
> Chriz




Die Idee währe richtig gut, wenn sie nicht einen gewaltigen Denkfehler beinhalten würde. Ich bedanke mich erstmal für deine Meinung, ich schätze es sehr und freue mich über jeden Beitrag aus der Community. 

Die Funktionsweise einer Sandbox ist unglaublich simpel und kaum offen für Lücken.

*Es gibt zwei globale Rechte die das OS dem Benutzer zur Verfügung stellt. Die Lese und die Schreib -Rechte. *

Bei einer Sandbox gibt es weiterhin beide Rechte Arten, allerdings führt die eine nicht zum gewünschten Ziel wie vom OS vorgesehen!

_
Bitte den nachfolgenden Text lesen und die Abbildung genauer betrachten. _







*Obere Zeichnung:*
Links sind die Applikationen abgebildet. Rechts der Datenträger.
Die zwei Pfeile dazwischen symbolisieren die Lese- & Schreib-Rechte. Wie man sieht führen beide auf dem direkten Wege und von A nach B und zurück.

*untere Zeichnung:*
Links sind die Applikationen abgebildet. Rechts der Datenträger. In der Mitte sieht man die Sandbox. Diese erkennt die Befehle vom OS und greift direkt auf die API des installieren Betriebssystems zu. Wenn nun der Befehl kommt das eine Datei gelesen werden soll wird dieser Befehl einfach weitergereicht. Im übergebenen Parameter ist ja schließlich der richtige Pfad mitgegeben. Sollte aber nun eine Methode aufgerufen werden,  die gerne einige 0en und 1en auf die Platte schreiben möchte _(es gibt keinen unterschied zwischen dem direkten schreiben einer Datei oder einem Eintrag in die Registriere)_, wird dies sofort von der Sandbox registriert. Nun wird der übergebene Pfad einfach durch einen anderen ersetzt. Dieser wird streng genommen gar nicht ersetzt sondern am Anfang um einen kleinen Eintrag erweitert. 


Aus dem Pfad. Crogramme\Windows\System32\Trojaner.exe

wird C:Sandbox\[Computername]\Programme\Windows\System32\Trojaner.exe

*Alles was sich unter C:Sandbox befindet wird ebenfalls umgelenkt. *Somit kommt nichts aus dem Verzeichnis raus.


Dein Denkfehler ist klar ersichtlich (zumindest wenn man mit der Funktionsweise vertraut ist) Egal welche Datei ich lese, ich werde immer an die echte Datei rankommen. Ein Virus der sich in der Sandbox befindet kann uneingeschränkt eine Verbindung zu einem Server aufnehmen und meine Dateien versenden! Meine originalen Daten!


----------



## Looky (19. August 2008)

Mhm, irgendwie versteh ich dich nicht.
Ich habe Testweise mal ein Applet geschrieben, welches versucht, eine Datei zu erzeugen (new File("c:\\").createNewFile()).

Anschließend bekam ich o.a. Fehlermeldung. Als ich das Applet signiert hatte, bekam ich diese Meldung nicht mehr. 

Das hier habe ich auch aus der Doku raus kopiert...



> This exception is thrown by the AccessController to indicate that a requested access (to a critical system resource such as the file system or the network) is denied.
> 
> The reason to deny access can vary. For example, the requested permission might be of an incorrect type, contain an invalid value, or request access that is not allowed according to the security policy. Such information should be given whenever possible at the time the exception is thrown.





```
try{
			FilePermission perm = new FilePermission("/temp/testFile", "read");
			AccessController.checkPermission(perm);
		}catch(AccessControlException e){
			System.out.println("Sandbox?");
		}
```


----------



## JavaEngel (19. August 2008)

Das ist normal, Applets können keine Daten schreiben, zumindest nicht auf dem Client.

Das hat zwar auch was mit dem Sandkasten Prinzip zu tun allerdings muss Java noch weitere Sicherheitsregeln einhalten.


----------



## Thomas Darimont (19. August 2008)

Hallo,

sowas wie eine Sandbox (eine eingeschränkte Umgebung) gibts IMHO nicht nur bei Applets. Du kannst auch eine normale
Standalone Applikation oder eine Server Anwendung in einer solchen geschützten Umgebung ablaufen lassen, in dem 
ein entsprechender SecurityManager (System.setSecurityManager()) verwendet wird. In der Java SE Standard Lib sind 
an den entsprechenden Stelen (Beispielsweise Festplatten, Netzwerkzugriff, ClassLoading) entsprechende Routinen hinterlegt
die vor einer solchen Aktion (manchmal auch indirekt via java.security.AccessController.doPrivileged(...))
immer den entsprechenden SecurityManager um Erlaubnis bitten.

Beispielsweise:
java.io.File.createNewFile():

```
public boolean createNewFile() throws IOException {
    SecurityManager security = System.getSecurityManager();
    if (security != null) security.checkWrite(path);
    return fs.createFileExclusively(path);
    }
```
etc.

Wenn System.getSecurityManager() nicht null zurück gibt kannst du davon ausgehen, dass du in einer potentiell 
eingeschränkten Umgebung läufst.

Beim initialisieren der Java Laufzeitumgebung werden verschiedene .policy Files ausgewertet in denen die "Rechte"  deklarativ beschrieben sind, auf diese Information greift der SecurityManager dann zurück.
In Applets wird beispielsweise der sun.applet.AppletSecurity verwendet. 

Gruß Tom


----------



## JavaEngel (19. August 2008)

oooooooooohhhhhhhhhhhhhhhhhhhhhhhhhh :suspekt:

Ich hab vergessen was zu erwähnen, deswegen konnte der User gerade meine sehr gute Beschreibung auch nicht verstehen. Ich meine eine echte Sandbox wie Sandboxie oder VMWare oder so. Aber in reinem Java wird das nicht gehen, ich sollte zu den C-lern gehen oder zu den Bat-lern ^^


----------



## Thomas Darimont (19. August 2008)

Hallo,

na ja, da hab ich aber schon bessere "Erklärungen" gelesen.


```
Also erstmal möchte ich euch sagen das Ihr euch für die schönste Sprache entschieden habt
```
Das ist relativ ;-)

Im speziellen fall von VMWare gibts IMHO schon Möglichkeiten festzustellen, ob man in einer solchen Umgebung läuft oder nicht. Beispielsweise mit dem VMWare SDK:
http://www.vmware.com/support/developer/vc-sdk/

Gruß Tom


----------



## Looky (20. August 2008)

Thomas Darimont hat gesagt.:


> Das ist relativ ;-)



Hängt den Ketzer!


----------



## Navy (20. August 2008)

Looky hat gesagt.:


> Hängt den Ketzer!


... einen Orden um!

Java ist relativ zu (Visual)Basic eine wunderschöne Sprache. Im Vergleich zu echten Programmiersprachen hingegen ist es eine Krücke.

SCNR


----------



## Oliver Gierke (20. August 2008)

[offtopic]Definiere "echt" oder willst du nur flamen?[/offtopic]


----------



## Navy (20. August 2008)

Oliver Gierke hat gesagt.:


> [offtopic]Definiere "echt" oder willst du nur flamen?[/offtopic]



Echt im Sinne von "nativ laufend", "schön strukturiert", "umfassend mächtig" und "kein speicherfressendes Monster". Und Ja. Meine Antwort war *natürlich* weniger ernst gemeint, wobei ich da aber auch ein wenig meine (rein subjektive) Abneigung gegen Java hab durchblicken lassen.

Ich bin der Meinung, dass man nicht alle Aussagen durch Emoticons kennzeichnen muss -- zumal das "SCNR" doch recht eindeutig ist.

Also, nichts für ungut.


----------



## takidoso (20. August 2008)

Navy hat gesagt.:


> Ich bin der Meinung, dass man nicht alle Aussagen durch Emoticons kennzeichnen muss -- zumal das "SCNR" doch recht eindeutig ist.


Die Abkürzung kenne ich noch nicht, was ist SCNR?


----------



## Oliver Gierke (20. August 2008)

Navy hat gesagt.:


> Echt im Sinne von "nativ laufend", "schön strukturiert", "umfassend mächtig" und "kein speicherfressendes Monster".


Bis auf den ersten Punkt wird das im Vergleich zum Initialpost nur noch subjektiver und damit haltloser.  Ich glaub ich versteh, dass man mit einer gewissen Programmiersozialisation zu solchen Vereinfachungen neigt. Allerdings zeugt das IMHO nicht von Weitsicht. Genausogut könnte man C Dialekte dafür blamen, ständig in einer Pointerhölle zu entarten, völlig unwartbaren Code zu fördern und sich schnell in die Reihe der Sprachen der speicherfressenden Monster einzureihen. Davon würde ich jedoch Abstand nehmen, schon um den Eindruck der Objektivität zu wahren .



takidoso hat gesagt.:


> Die Abkürzung kenne ich noch nicht, was ist SCNR?


Sorry, Could Not Resist

Me, too 

REINHAUN!


----------



## Adrian_Broher (20. August 2008)

Navy hat gesagt.:


> Echt im Sinne von "nativ laufend", "schön strukturiert", "umfassend mächtig" und "kein speicherfressendes Monster". Und Ja. Meine Antwort war *natürlich* weniger ernst gemeint, wobei ich da aber auch ein wenig meine (rein subjektive) Abneigung gegen Java hab durchblicken lassen.
> 
> Ich bin der Meinung, dass man nicht alle Aussagen durch Emoticons kennzeichnen muss -- zumal das "SCNR" doch recht eindeutig ist.
> 
> Also, nichts für ungut.



<°((><

Ich wuensche einen guten Appetit.


----------

