Tag Archives: javafx

JavaFX security

I had some concerns regarding JavaFX security. You know, if you go to JavaFX samples page, most of them are self-signed and you have to give them all permissions to be able to run them. I didn’t like it at all. On Devoxx I asked few guys from Sun about it and their responses were not clear. So I have decided to do few experiments to find out how it works. It’s nothing new, it’s similar to the way applets have worked all the time. But who remembers how applet security works?

I took InterestingPhotos sample application from JavaFX pages and added following code to onNext function (behold, my very first JavaFX code).

try {
	var writer = new FileWriter(new File(System.getProperty("user.home"),"javafx_infection.txt"));
	writer.append("I have escaped the browser. {new Date()}");
	writer.close();
} catch (e:Exception) {
	e.printStackTrace();
}

Now every time user clicks on the “next” button, the applet attempts to write to a file in user home directory. It can be both a malicious code or a legitimate action. There is no way to tell them apart. That’s the reason why we need some security mechanism.

Unsigned application
Example
You can choose not to sign the application at all. Usually it is the best choice. This way the application will run in a sandbox and will not be able to execute any potentially dangerous code. On the other hand it will be safe for user to run it and he will not be troubled by any security alert. If the application attempts to execute dangerous code, the JRE will throw a security exception. In our case it will throw

java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at interesting.Main.hackIt(Main.fx:406)
at interesting.Main.onNext(Main.fx:133)

So if you don’t need to do anything dangerous and you are happy to play in the sandbox, unsigned application is the best choice.

Selfsigned application
Example
Most of the samples on JavaFX page are self-signed. It means that the JAR is signed by a certificate that is not verified by any certification authority. In my opinion, that’s the worst option you can choose. You force the user to answer following security dialog.

Security Warning

Basically it’s the same as executing EXE (or binary) file only more dangerous. Some users already know that they should not execute EXE files from unknown sources, but they don’t know that they shouldn’t execute Java applications from unknown sources. I am afraid that we will hear about this issue more in the future.

If the user clicks on Run, the application can do whatever it want, if the user clicks on Cancel, the application will not run at all.

Signed application
Example
We can sign the application by a certificate that is validated by a CA. I have used Thawte Freemail Certificate. Sounds trustworthy, doesn’t it? If you open the example, you will see following security warning.

Security Warning

It looks less threatening than with the selfsigned certificate. It looks less dangerous. The “Always trust” check-box is even checked by default. But in fact, it’s not much safer. It is more complicated to generate such certificate but anyone (even me) can do it. It might be even more dangerous. Everyone who is able to generate a certificate that is validated by the same CA will be allowed to execute the code (if you leave the check box checked). And again, it is all or nothing choice. User can either give the application all permissions or do not run it at all.

Unsigned application with signed JAR
Example
In case you really need to do something potentially dangerous and you do not want to scare the user at the start of the application, you can use signed JAR in an unsigned application. Basically you can put all the dangerous stuff into a jar and sign only this jar. Most of the code can live in the main application which is unsigned. This way the application will start as unsigned and when you attempt to execute the dangerous parts the signed jar will be loaded and the security warning will be shown. In our example the application will start and the security warning will be shown when user clicks on the “next” button. At least that’s how it works on my machine. And I like it. This way user can use my application and is notified only when the application needs to do something insecure. And even if he decides that he doesn’t trust me, he can still use the application. (This idea came from a guy from Sun, unfortunately I don’t remember his name, thanks anyway)

To reiterate, the most secure choice is to write a JavaFX application that does not need any security permissions. If you do not sign it, it runs in the sandbox and everything is fine. If you need to execute some dangerous code, you have to ask user for a permission. Which is good, but users should be instructed that they shouldn’t execute any Java(FX) code if they are not sure what it does. So there is a possibility that they will not execute your applications because they will be afraid to do so. I can imagine that in the next versions of JavaFX there will be a signed library provided by Sun that will contain operations that are potentially dangerous but that are in fact safe. Like opening a file using “Open File dialog” etc.

Disclaimer: I am server-side developer, I know nothing about client-side Java, so do not be surprised if something I have written here turns up being wrong. Just correct it in the comments. Thanks.

Jak jsem potkal JavaFX

Tak si říkám, jestli má to co se chystám napsat vůbec cenu. Spoustu lidí tím asi naštvu a nikomu tím asi nepomůžu. No ale budiž, nechť se rozpoutá plamenná diskuze.

Předevčírem Sun vydal první ostrou verzi Javy FX. Včera byl můj poslední den v práci a odpoledne jsem neměl už moc co dělat, tak jsem si řekl, že se na to podívám. Jdu na javafx.com, kliknu na Effects playground příklad a Firofox se zasekne. Asi po minutě se probudí a v okně je prázdná plocha kde by asi měl být applet. Hmm, nic moc. (Firefox 2, Windows XP). Přestalo mě to bavit, ale dneska jsem se doma rozhodl, že se na to pořádně podívám.

Abych tomu poskytl co nejlepší podmínky, nastartoval jsem do Windows XP a nainstaloval jsem nejnovější JRE. Tady si nemohu odpustit drobné pošťouchnutí. Z neznámého důvodu je instalační obrázek takový nějaký kostrbatý. Rozhodně to nevypadá moc profesionálně.

Instalace JRE

Po instalaci JRE, jdu do Firefoxu 3, kliknu na příklad a po chvíli čekání na můj pomalý internet se objeví co? Staré známé okýnko.

Alert

Chápu bezpečností problémy, ale když se na tu hlášku zkusím podívat z pohledu normálního uživatele, tak vidím Warning, pozor, něco ošklivého se děje. Security, to bude nějaký virus. Vykřičník, to bude něco nebezpečného. Rychle pryč.

Rozhodně nejsem expert na uživatelské rozhraní, ale myslím si, že by neškodilo malé vysvětlení. Něco v tom stylu: „Chystáte se spustit program, který bude mít právo na přístup k vašemu disku. Pokud mu nedůvěřujete, klikněte na Zrušit, bla bla bla…“. Navíc si říkám, že by se taková hláška mělo objevit před tím, než se program poprvé pokusí udělat něco potenciálně škodlivého. Nechápu proč musí děsit uživatele ještě před tím než vůbec něco uvidí. Nechal bych si ho s aplikací pěkně pohrát a až by se pokusil otevřít soubor tak bych to na něj vypálil.

Když jsem sebral dost odvahy a rozhodl se důvěřovat JavaFX týmu, že mi nevymaže disk, klikl jsem na Run a konečně se mi zobrazil kýžený příklad. Tady musím lidi ze Sunu pochválit, vypadá to super. Navíc se opravdu dá chňapnout a táhnout, takže vypadá jako normální aplikace. Skvělé. No, na druhou stranu když kliknu na “Otevřít soubor”, objeví se následující okýnko.

Open

Uuups, tohle že jsou Windows XP? Já vím, je to maličkost, ale ďábel je ukryt v detailech.

Dokonce jsem se i chvíli snažil spustit příklad pod mým 64bitovým Ubuntu. Marně. Firefox plugin pro amd64 možná bude v Javě 7, možná v Javě 6. Nikdo neví. Viz bug 4802695 (všimněte si data vzniku). Problém není jen v pluginu, celé Java FX prý Linux nepodporuje. Ale, že prý si mám nainstalovat verzi pro Mac, ta že prý na Linuxu skoro funguje. Hmm.

Rozhodně bych si přál aby se Java pořádně dostala ze serverů i na klienty. Nevím jestli je Java FX tou pravou cestou. Když to srovnám s Flashem, tak má pořád ještě co dohánět. Možná namítnete, že srovnání s Flashem není spravedlivé, že se Java FX zaměřuje na jinou skupinu uživatelů. Ale je to opravdu tak? Podívejte se na příklady, evidentně se snaží dokázat, že umí to co umí Flash.

Jestli se chce Java FX chytit na už obsazeném trhu, musí nabídnout něco navíc než konkurence. Něco navíc pro uživatele, ne pro programátora. Nějakou killer aplikaci. Zatím jsem na nic takového nenarazil. Přesouvání apletu na plochu je pěkné, ale nevidím důvod proč by to lidi chtěli začít používat. Ale třeba mi to na Devoxxu někdo vysvětlí.