Use of an insecure Bluetooth connection
安全でないBluetooth接続の使用
説明
アプリは暗号化がオフになっている、安全でないBluetooth接続を使用しています。接続されたデバイスの物理的な近くにいる攻撃者は、中間者攻撃を使用して、送信されたデータを傍受または変更する可能性があります。
推奨事項
Bluetoothを使用した安全な接続および情報交換の手段を使用することを推奨します。これは、MiTM攻撃のリスクを軽減するためにソケット接続を暗号化できる createRfcommSocketToServiceRecord や listenUsingRfcommWithServiceRecord で可能です。
import java.io.IOException;
import java.util.UUID;
import javax.bluetooth.*;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
public class BluetoothClient {
private static final String SERVER_MAC_ADDRESS = "00:11:22:33:44:55"; // サーバーのMACアドレスに置き換えます
private static final UUID SERIAL_UUID = new UUID(0x1101);
public static void main(String[] args) {
try {
// サーバーデバイスの検出と接続
LocalDevice localDevice = LocalDevice.getLocalDevice();
DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent();
RemoteDevice remoteDevice = discoveryAgent.getRemoteDevice(SERVER_MAC_ADDRESS);
String url = "btspp://" + SERVER_MAC_ADDRESS + ":" + SERIAL_UUID + ";authenticate=false;encrypt=false;master=false";
StreamConnection streamConnection = (StreamConnection) Connector.open(url);
// 正常に接続されました。これで、streamConnectionを介してデータの読み書きができるようになりました
// 完了したら接続を閉じます
streamConnection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (BluetoothStateException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.bluetooth.*;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
import javax.microedition.io.StreamConnectionNotifier;
public class BluetoothServer {
private static final UUID SERIAL_UUID = new UUID(0x1101);
private static final String SERVER_NAME = "BluetoothServer";
public static void main(String[] args) {
try {
// Bluetoothサーバーを作成します
LocalDevice localDevice = LocalDevice.getLocalDevice();
localDevice.setDiscoverable(DiscoveryAgent.GIAC);
// サーバー接続を作成し、待機を開始します
String url = "btspp://localhost:" + SERIAL_UUID + ";name=" + SERVER_NAME;
StreamConnectionNotifier connectionNotifier = (StreamConnectionNotifier) Connector.open(url);
System.out.println("サーバーが起動しました。クライアントの接続を待機しています...");
// 着信接続を待機します
while (true) {
StreamConnection connection = connectionNotifier.acceptAndOpen();
// クライアント接続を別のスレッドで処理します
Thread clientThread = new Thread(new ClientHandler(connection));
clientThread.start();
}
} catch (IOException e) {
e.printStackTrace();
} catch (BluetoothStateException e) {
e.printStackTrace();
}
}
// クライアント接続を処理するRunnableクラス
static class ClientHandler implements Runnable {
private StreamConnection connection;
public ClientHandler(StreamConnection connection) {
this.connection = connection;
}
@Override
public void run() {
try {
System.out.println("クライアントが接続されました: " + connection);
// 通信用の入力ストリームと出力ストリームを取得します
InputStream inputStream = connection.openInputStream();
OutputStream outputStream = connection.openOutputStream();
// クライアントとの通信を実行します。たとえば、データの読み取りと書き込みを行います
// 完了したら接続を閉じます
inputStream.close();
outputStream.close();
connection.close();
System.out.println("クライアントが切断されました: " + connection);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
リンク
標準
- OWASP_MASVS_L1:
- MSTG_NETWORK_1
- OWASP_MASVS_L2:
- MSTG_NETWORK_1
- GDPR:
- ART_5
- ART_32
- PCI_STANDARDS:
- REQ_2_2
- REQ_4_2
- REQ_6_2
- OWASP_MASVS_v2_1:
- MASVS_NETWORK_1
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_6_7
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CNIL_FOR_DEVELOPERS:
- DEVELOPERS_4_1_1
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213