Klasa FXPermision
Klasa zawiera zestawienie pozwoleń, których możemy udzielić kodowi JavaFX.
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");