Klasa FXPermision

Klasa zawiera zestawienie pozwoleń, których możemy udzielić kodowi JavaFX.

Zestawienie pozwoleń FXPermission
Docelowa nazwa uprawnień Na co uprawnienie pozwala Ryzyko przyznania uprawnień
accessClipboard Wysyłanie i pobieranie informacji do i ze schowka systemowego Umożliwienie złośliwej aplikacji udostępnienia lub odczytania potencjalnie wrażliwych albo poufnych informacji.
accessWindowList Dostęp do listy wszystkich okien JavaFX Uzyskanie dostępu do listy wszystkich okien JavaFX może dać złośliwej aplikacji możliwość modyfikowania okna dialogowego zabezpieczeń.
createRobot Utworzenie obiektu JavaFX Robot Obiekt JavaFX Robot umożliwia kodowi generowanie natywnych zdarzeń myszy i klawiatury, a także tworzenie migawek z ekranu. Mogłoby to pozwolić złośliwemu kodowi na kontrolowanie systemu, uruchamianie innych programów, odczytywanie danych z ekranu oraz odmówienie użytkownikowi dostępu do myszy i klawiatury.
createTransparentWindow Tworzenie przezroczystych okien Przezroczyste okna nie ograniczają się do prostokątnego obszaru, który zasłania to, co znajduje się pod oknem. Może to utrudnić odróżnienie części okna od innych okien aplikacji lub pulpitu platformy i może być wykorzystywane do umożliwienia złośliwej aplikacji nakłonienia użytkownika do wprowadzenia poufnych danych, zwłaszcza w połączeniu z setWindowAlwaysOnTop or unrestrictedFullScreen.
loadFont Ładowanie niestandardowej czcionki za pomocą Font.loadFont(java.lang.String, double) lub pliku jar zawierającwgo osadzone czcionki wymienione w Manifeście jar. Załadowanie niestandardowej czcionki może umożliwić złośliwej aplikacji dostarczenie zniekształconej czcionki. Taka czcionka może spowodować awarię aplikacji, umożliwiając złośliwej aplikacji przejęcie kontroli nad systemem, jeśli występują błędy w implementacji czcionki platformy.
modifyFXMLClassLoader Ustawienie ładowarki klas używanej do ładowania obiektów FXML i usunięcia ograniczeń klas systemów ładowania. Zezwolenie aplikacji na ustawienie dowolnej ładowarki klas może umożliwić złośliwej aplikacji ładowanie klas z podwyższonymi uprawnieniami. Również usunięcie ograniczenia wczytywania klas systemowych przez ustawienie wartości null dla ładowarki klas, może pozwolić aplikacji na dostęp do klas, do których dostęp w przeciwnym przypadku byłby zabroniony.
setWindowAlwaysOnTop Ustawienie dla okna właściwości zawsze-na-wierzchu: Stage.setAlwaysOnTop(boolean) Złośliwe okno może wyglądać i zachowywać się jak
pulpit platformy, dzięki czemu informacje wprowadzone przez nic niepodejrzewającego użytkownika mogą zostać przechwycone, a następnie niewłaściwie wykorzystane, szczególnie w połączeniu z uprawnieniem createTransparentWindow.
unrestrictedFullScreen Zezwolenie na nieograniczony dostęp do pełnego ekranu, w tym zdarzeń związanych z klawiaturą i banerem ostrzegawczym. To uprawnienie pozwala aplikacji na przejście w tryb pełnoekranowy w dowolnym momencie, pominięcie banera ostrzegawczego i wyłączenie funkcji klawisz ESC, pozwalającego na wyjście z trybu pełnoekranowego. Wszystkie dane wprowadzane z klawiatury w trybie pełnoekranowym zostaną dostarczone do aplikacji zamiast ograniczania się do zdarzeń KEY_PRESSED i KEY_RELEASED dla podzbioru klawiszy. Zobacz Stage.setFullScreen(boolean). Może to pozwolić złośliwemu oknu na wyglądanie i zachowywanie się jak pulpit platformy, dzięki czemu informacje wprowadzane przez nic niepodejrzewającego użytkownika mogą zostać przechwycone, a następnie niewłaściwie wykorzystane, szczególnie w połączeniu z uprawnieniem createTransparentWindow.

Udzielanie pozwoleń

Pozwolenia są przyznawane kodowi wykonywanemu w obrębie piaskownicy systemu operacyjnego, a więc kodom z obcych zródeł uruchamianym przez przeglądarkę albo uruchamianym z obcych plików archiwów *.jar.

Kody, które są uruchamiane lokalnie, a więc poza przeglądarką na ogół nie wymagają dodatkowych pozwoleń, z wyjątkiem uruchamiania niektórych plików *.jar.

Pozwolenie jest niezbędne jeśli na komputerze jest uruchomiony SecurityManager. Co prawda klasa ta oznaczna jest klauzulą deprecated, ale dopiero od JDK 17.

Właściwości systemowe

Właściwości java.home i user.home możemy odczytać następująco:

Properties props = System.getProperties();
System.out.println("java.home = " + props.getProperty("java.home"))
System.out.println("user.home = " + props.getProperty("user.home"))

U mnie wynikiem uruchomienia kodu jest:

java.home = C:\Program Files\Java\jdk-17.0.3.1
user.home = C:\Users\Jacek

Umiejscowienie plików pozwoleń

Własny plik pozwolenia może mieć nazwę .java.policy – zwróć uwagę na kropkę na początku nazwy.

Własny plik pozwolenia może też mieć dowolną nazwę np. MyApp.policy

Plik pozwoleń są umieszczane w

  • policy.url.1=file:${java.home}/conf/security/java.policy
  • policy.url.2=file:${user.home}/.java.policy

Systemowe pliki mieszczą się pod pierwszym adresem i mają nazwę java.policy

Własne pliki pozwoleń umieszczamy pod drugim adresem pod nazwą .java.policy. Te pliki będą widoczne zawsze. Nie zawsze jest to sytuacja pożądana.

Pliki mające dowolną nazwę możemy umieścić np. w uruchamianym kodzie. Wtedy musimy podać systemowi lokalizację pliku polityki.

Jeśli pliki polityk nie są widoczne, musisz zmienić ustawienia folderów i plików w Windows.

Treść pliku pozwolenia

Ta polityka pozwala na wykonywanie wszystkich ryzykownych operacji.

grant {

   permission javafx.util.FXPermission "accessClipboard";
   permission javafx.util.FXPermission "accessWindowList";
   permission javafx.util.FXPermission "createRobot";
   permission javafx.util.FXPermission "createTransparentWindow";
   permission javafx.util.FXPermission "loadFont";
   permission javafx.util.FXPermission "modifyFXMLClassLoader";
   permission javafx.util.FXPermission "setWindowAlwaysOnTop";
   permission javafx.util.FXPermission "unrestrictedFullScreen";

}

Plik pod nazwą .java.policy umieszczamy w ${user.home}/. Nic więcej nie musimy robić.

Położenie nietypowego pliku polityki możemy wskazać systemowi umieszczając w kodzie instrukcję:

System.setProperty("java.security.policy", "MyApp.policy");

Właściwość możemy usunąć:

System.clearProperty("java.security.policy");