Java-Bug in Modulsystem bei Nutzung von JAAS

vorhergehende Artikel in: Java Software-Test Rants
20.02.2018

Ich stand und stehe immer noch der Implementierung des Modulsystems in Java9 ablehnend gegenüber. Neulich war es draußen so, dass ich lieber drin blieb und ich erinnerte mich an eine Test-Suite, die ich bei der Umstellung auf Java8 dazu nutzte, Imkompatibilitäten meiner Anwendungen festzustellen und auszumerzen.

Zu den Test-Themen zählten unter anderem:

  • Custom ClassLoader
  • Java3D
  • JAAS
  • Java Webstart (als Server und Client)

Ich reaktivierte also diese kleinen Tests und ließ mich überraschen. Tatsächlich wurde ich auch überrascht: der JAAS-Test schlug fehl. Ich brauchte einige Zeit, dahinterzukommen warum er fehlschlug.

Dazu vielleicht zunächst ein wenig Hintergrund: Das JAAS-Szenario sah so aus, dass ich darüber die Authentifizierung realisierte. Dadurch wird ein Principal aufgebaut, der dann vom SecurityManager benutzt wird um zu prüfen, ob der Code, der gerade ausgeführt wird, auch über die entsprechende Permission verfügt.

Ich benutzte zur Erstellung des Prinzipals den com.sun.security.auth.module.UnixLoginModule. Unter Java8 funktionierte der Test problemlos, unter Java9 wurden keinerlei Permissions vergeben.

Nach langwieriger Suche stellte sich die Situation für mich so dar, dass Oracle selbst das neue Modulsystem nicht restlos durchschaut, denn im Zuge der Arbeit des SecurityManager wird an den Principals die Methode hashCode aufgerufen - die wiederum die Methode toString aufruft, um den Hash aus dem resultierenden String zu errechnen.

Da die Methode toString jedoch die Stringrepräsentation aus ResourceBundles (Stichwort I18n) zusammensetzt, fliegt unter Java9 eine ResourceNotFoundException, weil das benötigte ResourceBundle nicht im Klassenpfad gefunden werden kann.

Das wirklich witzige daran ist, dass man diesen Fehler umgehen kann, wenn man direkt nach dem Login alle Principals des Subject holt und an jedem vorsorglich einmal die toString-Methode aufruft. Zu diesem Zeitpunkt weiß Java noch, wo das ResourceBundle im ClassPath liegt und das sorgt dafür, dass die Ressourcen dann auch gefunden werden, wenn der SecurityManager sie benötigt.

Die Dateien zum Nachvollziehen sind angehängt: Unter Java8 funktioniert die Beispielanwendung mit oder ohne Kommandozeilen-Parameter, unter Java9 funktioniert sie nur mit Kommandozeilenparameter - das schaltet nämlich den Workaround an...

Die Anwendung muss mit den drei System-Properties

  • java.security.auth.login.config
  • java.security.manager
  • java.security.policy
gestartet werden, damit JAAS entsprechend konfiguriert wird und der SecurityManager über die Rechte des Principals informiert ist.

Ich habe nicht versucht, ob derselbe Mechanismus mit denselben fatalen Folgen unter Windows zum Tragen kommt.

Ein entsprechender Bug wurde gemeldet und ist zur Zeit intern unter Review.

JAAS-Konfiguration
Security-Policy
Beispielanwendung

Aktualisierung vom 20. Februar 2018

Der Bug wurde unter JDK-8198352 in die Java Bug Database aufgenommen.

Artikel, die hierher verlinken

Rechtevergabe in Java

04.11.2018

Eine Klarstellung zum Thema Java, SecurityManager, Principals und Permissions

Java9 Umstellung

16.04.2018

Die Umstellung auf Java9 in meinen eigenen Projekten ist abgeschlossen

Batik und Java9 Modulsystem = ☠

25.02.2018

Nachdem ich bereits über den einen oder anderen Bug in Verbindung mit Java 9 berichtet habe, habe ich bereits wieder einen gefunden - und wieder verbunden mit der ach so tollen Erfindung des Java-Modulsystems

Änderungen im Datumsformat von Java - schon wieder!

25.02.2018

Ich habe bereits über einen Bug in Java9 berichtet, der mich ziemlich überrascht hat. Wer aber beschreibt meine Überraschung, dass der Bug, der mich beim Umstieg von Java7 auf Java8 bereits angespuckt hat, wieder Speichel gesammelt hat?

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Fährnisse des Buildprozesses unter Windows

    17.07.2019

    Nachdem ich begonnen hatte, mich mit der Beschleunigung der Berechnung des Mandelbrot-Fraktals unter Zuhilfenahme der Shadereinheiten in Graphikkarten zu beschäftigen und erste Erfolge feiern konnte, wollte ich das mal auf einer richtigen Graphikkarte ausprobieren...

    Weiterlesen...

Neueste Artikel

  • Datenvalidierung UTF8 mit BiDi-Steuerzeichen (TrojanSource 2.0)

    Ich bin heute nochmal inspiriert worden, weiter über die Trojan Source Vulnerability nachzudenken. Meiner Meinung nach bestehen hier noch Probleme - speziell bei Nutzereingaben oder Daten, die über externe Schnittstellen ampfangen werden.

    Weiterlesen...
  • OpenStreetMap Navi als Docker-Container

    Ich habe die auf OpenStreetMap basierende OpenSource Navigationslösung Graphhopper in einen Docker-Container gepackt und als neuestes Mitglied in meinem Docker-Zoo willkommen geheißen.

    Weiterlesen...
  • SQL-Aggregatfunktionen in SQLite als BeanShell-Scripts

    Ich habe neulich über eine Möglichkeit berichtet, SQLite mittels der sQLshell und Beanshell-Skripten um SQL-Funktionen zu erweitern. In diesem Artikel versprach ich auch, über eine solche Möglichkeit für Aggregatfunktionen zu berichten.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.