Exploiter facilement des fonctions natives avec le projet panama
Courte introduction du tools-in-action au Devoxx France 2022 sur l'appel de fonctions natives sur le JDK18 et la JEP-419.
Code: https://github.com/bric3/panama-watch
Support from the runtime Objective: ● easy support of foreign function without 3rd party ● efficient ● flexible ● improved security ● rely on MethodHandles
Invoke native code with JDK 18 Project is still incubating, so it requires to add modules ● for compilation ● and for execution $ javac --add-modules jdk.incubator.foreign ... $ java --enable-native-access=ALL-UNNAMED \ --add-modules jdk.incubator.foreign ...
Invoke native code with JDK 18 var lookup = CLinker.systemCLinker(); System.load(libPath.toAbsolutePath().toString()); var lookup = SymbolLookup.loaderLookup(); Choose the right lookup ● systemLookup for system symbols like those in libc ● loaderLookup for loaded libraries
Invoke native code with JDK 18 try (var scope = ResourceScope.newConfinedScope()) { var segmentAllocator = SegmentAllocator.nativeAllocator(scope); var recipientPublicKey = segmentAllocator.allocate(crypto_box_publickeybytes()); var recipientSecretKey = segmentAllocator.allocate(crypto_box_secretkeybytes()); crypto_box_keypair.invoke(recipientPublicKey.address(), recipientSecretKey.address()); } Open a scope (for memory safety) ⚠ newImplicitScope ⟹ closed by GC 👌 newConfinedScope ⟹ full control
Invoke native code with JDK 18 try (var scope = ResourceScope.newConfinedScope()) { var segmentAllocator = SegmentAllocator.nativeAllocator(scope); var recipientPublicKey = segmentAllocator.allocate(crypto_box_publickeybytes()); var recipientSecretKey = segmentAllocator.allocate(crypto_box_secretkeybytes()); crypto_box_keypair.invoke(recipientPublicKey.address(), recipientSecretKey.address()); } Make the call
Better memory mapped files Memory mapping files in memory is a OS feature Allows to put the region of a file in memory MappedByteBuffer implements this feature ● ⚠ stays in memory until the buffer itself is garbage collected
Le projet Panama ? ● JEP 419 (Java 18) https://openjdk.java.net/jeps/419 ● A practical look at JEP 412 (Java 17) with Libsodium https://blog.arkey.fr/2021/09/04/a-practical-look-at-jep-412-in-j dk17-with-libsodium/ ● Java Project Panama au ParisJug Nov 2021 (deep dive de 1h30) https://youtu.be/hrqi-KJ_74I ● https://inside.java ● https://github.com/bric3/panama-watch