Estoy ejecutando una aplicación J2SE que es algo confiable (Minecraft) pero que probablemente contenga complementos completamente no confiables (y probablemente incluso algunos hostiles).
Me gustaría crear un complemento que pueda acceder a los pines GPIO en Raspberry PI.
Cada solución que he visto requiere que dicha aplicación reciba sudo-superpowers porque se accede a gpio a través del acceso directo a la memoria.
Parece que la solución correcta es proporcionar una opción de línea de comandos como esta:
-Djava.security.policy=java.policyque parece no tener permisos predeterminados (incluso acceso a archivos y puertos altos), luego agregue los que su aplicación necesita nuevamente con el archivo de políticas.
En efecto, parece que está otorgando poderes "sudo" a Java y luego confiando en el modelo de seguridad de Java para otorgar solo los poderes apropiados a varias clases. Supongo que esto hace que la aplicación sea segura para ejecutar con sudo, ¿es correcto?
Es gracioso que haya estado usando Java casi todos los días desde 1.0 y nunca lo haya necesitado antes... Aprendes algo nuevo todos los días.
[Descargo de responsabilidad: no estoy muy convencido del modelo de seguridad de Java.]
La forma en que resolvería esto es hacer que el código que necesita para acceder al hardware se ejecute como un proceso privilegiado separado, luego haga que su aplicación Java se ejecute como un proceso sin privilegios y se conecte al proceso privilegiado para que realice ciertas acciones en su nombre.
En el proceso privilegiado, debe verificar con máxima desconfianza cada solicitud si es segura de ejecutar. Si tiene miedo de que otros procesos sin privilegios también puedan conectarse al demonio y hacer que ejecute comandos que no debería, puede hacer que su socket sea propiedad de un grupo especial y setgid() la aplicación Java a ese grupo mediante un pequeño contenedor escrito en C antes de que se inicie.
Los sockets de dominio Unix son probablemente la mejor opción, pero si desea hacer chroot() en la aplicación Java, es posible que necesite un socket TCP/IP.