2 votes

Executing bundled shell command in a hardened runtime application

J'ai écrit une application Java que je veux distribuer sous forme de bundle d'application macOS. L'application doit exécuter une application en ligne de commande qui fait également partie du bundle. Le bundle est correctement signé (vérifié en utilisant la commande codesign) et le runtime renforcé est activé.

Je suis capable de lancer l'application, mais ensuite l'application échoue à exécuter l'application en ligne de commande incluse.

Le code utilisé pour exécuter l'application en ligne de commande :

Runtime.getRuntime().exec("/chemin/vers/le/bundle/Contenu/cli/monApplicationEnLigneDeCommande");

Le code fonctionne bien lorsque je signe le bundle sans activer le runtime renforcé. Une fois que j'active le runtime renforcé, j'obtiens l'exception suivante :

Impossible d'exécuter le programme "monApplicationEnLigneDeCommande" : erreur=0, posix_spawn a échoué

Qu'est-ce que je fais de mal ? Est-il même possible de générer des processus enfants à partir d'une application en runtime renforcé ?

La version du runtime Java que j'utilise est AdoptOpenJDK (build 11.0.4+11). L'application n'est pas sandboxée. Les droits que j'ai utilisés lors de la signature du bundle étaient

com.apple.security.cs.allow-jit

com.apple.security.cs.allow-unsigned-executable-memory

com.apple.security.cs.disable-executable-page-protection

com.apple.security.cs.disable-library-validation

com.apple.security.cs.allow-dyld-environment-variables

com.apple.security.automation.apple-events

0 votes

J'ai ajouté les informations d'autorisation dans mon post. Le chemin vers le binaire est correct, si je signe le bundle sans utiliser l'option d'exécution renforcée, le binaire peut être exécuté sans problème. Ce n'est que lorsque j'ajoute l'option d'exécution renforcée que l'exécution échoue.

2voto

Le problème était lié à mon processus de construction lui-même, et non au runtime renforcé auquel je pensais. En fait, lorsque j'ai activé le runtime renforcé, une application de lancement a également été mise en place à l'intérieur du paquetage qui démarre l'application principale en utilisant le JRE inclus.

Comme il s'agit de l'AdoptOpenJDK que j'ai mentionné, il utilise spawn pour Runtime.exec, ce qui a causé le problème. Une fois que j'ai ajouté System.setProperty( "jdk.lang.Process.launchMechanism", "FORK"); à ma méthode principale, Runtime.exec a recommencé à fonctionner correctement, même avec le runtime renforcé activé.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X