Javaでは、ネットワーク上で(暗号化なしで)オブジェクトを送受信するために、次の操作を行うことができます。Man In The Middle攻撃を介してネットワーク経由で送信されるJavaオブジェクトにコードを挿入することは可能ですか?
class Dog {
public void bark(){ System.out.println("Woof! Woof!"); }
}
Client.java
Dog fido = new Dog();
Socket socket = new Socket(new InetSocketAddress("192.168.1.2"), 1234);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(fido);
oos.flush();
oos.close();
Server.java
ServerSocket server = new ServerSocket(1234);
Socket client = server.accept();
ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
Dog fido = (Dog)ois.readObject();
ois.close();
fido.bark();
私の質問は、あなたが送信している2つのネットワークデバイス間の遮断点を正常に確立したとしJavaオブジェクトが保護されていないリンク上を行き来していて、そのprotocを知っている彼らのデータを変更することができます、Javaバイトコードをオブジェクトに注入して、その動作を変更することは可能ですか?
私たちの小さな例では、fido
「ムー!の代わりに吠えますか?
Java *コードではなく*データ*を送信していますので、 – Andreas
オブジェクトのシリアル化では、値とその値を挿入するクラスのみが記録されることに注意してください。バイトコードはありません。これは、クライアントとサーバーの両方に既に存在している必要があります。したがって、デシリアライズされるクラス(別のもの)とそのデータを変更することができます。 –
しかし、リサーチでは、デシリアライズ時にリモートコードが実行されるオブジェクトグラフを作成する方法が見つかりました。https:// foxglovesecuritycom/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-in-common-this-vulnerability/ –