コンパイル言語でもJavaではセキュリティホールになりうる

なぜPHPでrequire("http://...")したらセキュリティホールなのに、Goならいいのか - kazuhoのメモ置き場

コンパイル言語でも、コンパイル時にプログラムの内容が確定しない言語、実行時にライブラリをダイナミックロードして、ロードパスにhttpのURL指定できると同じ問題が発生しますな。つまりJavaはこのセキュリティホールが発生しうる。普通やる奴いないと思うけど

Javaはご存知の通り、コンパイル時には依存するクラスの型とメソッドシグニチャのチェックを行うが、クラスの内容までは見ない。クラスファイルの内容は実行時にクラスローダによってダイナミックにロードされる。そしてクラスローダの正体は URLClassLoader という、いかにもな名前のクラスで、想像の通り http://172.28.8.32/hoge.jar のようなURLを処理可能なのだ。

環境変数やコマンドのオプションでクラスパスを指定した場合はセキュリティの制限がかかるのだが、それ以外の場合にはhttpのURLの指定が有効になる。たとえば実行可能jar。マニフェストファイルのClass-PathにhttpのURLを指定可能で、以下の記述は有効だ。

Manifest-Version: 1.0
Main-Class: Main
Class-Path: http://localhost/hoge.jar

このような実行可能jarを利用するケースはほとんど無いと思われるが、仮にあってもローカルエリアのサーバを指定していれば、それほど問題ないだろう。しかしgithub.comやrepo1.maven.org等が指定されていると結構危ない臭いがする。