Aller au contenu

Use of an insecure Bluetooth connection

Utilisation d'une connexion Bluetooth non sécurisée

Description

L'application utilise une connexion Bluetooth non sécurisée, avec le chiffrement désactivé. Un attaquant se trouvant à proximité physique des appareils connectés peut utiliser une attaque de l'homme du milieu (Man in the Middle) pour intercepter et/ou modifier les données transmises.

Recommandation

Il est recommandé d'utiliser des moyens de connexion et d'échange d'informations sécurisés avec Bluetooth, ce qui est possible avec createRfcommSocketToServiceRecord et listenUsingRfcommWithServiceRecord qui permettent de chiffrer la connexion socket pour atténuer le risque d'attaques MiTM.

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"; // Remplacez par l'adresse MAC de votre serveur
    private static final UUID SERIAL_UUID = new UUID(0x1101);

    public static void main(String[] args) {
        try {
            // Découverte et connexion à l'appareil serveur
            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);

            // Connecté avec succès, vous pouvez maintenant lire et écrire des données via la streamConnection

            // Fermez la connexion une fois terminé
            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 {
            // Créez un serveur Bluetooth
            LocalDevice localDevice = LocalDevice.getLocalDevice();
            localDevice.setDiscoverable(DiscoveryAgent.GIAC);

            // Créez une connexion serveur et commencez à écouter
            String url = "btspp://localhost:" + SERIAL_UUID + ";name=" + SERVER_NAME;
            StreamConnectionNotifier connectionNotifier = (StreamConnectionNotifier) Connector.open(url);

            System.out.println("Serveur démarré. En attente de la connexion des clients...");

            // Écoutez les connexions entrantes
            while (true) {
                StreamConnection connection = connectionNotifier.acceptAndOpen();

                // Gérez la connexion client dans un thread séparé
                Thread clientThread = new Thread(new ClientHandler(connection));
                clientThread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BluetoothStateException e) {
            e.printStackTrace();
        }
    }

    // Classe Runnable pour gérer les connexions clients
    static class ClientHandler implements Runnable {
        private StreamConnection connection;

        public ClientHandler(StreamConnection connection) {
            this.connection = connection;
        }

        @Override
        public void run() {
            try {
                System.out.println("Client connecté : " + connection);

                // Obtenez les flux d'entrée et de sortie pour la communication
                InputStream inputStream = connection.openInputStream();
                OutputStream outputStream = connection.openOutputStream();

                // Effectuez la communication avec le client, par exemple, lisez et écrivez des données

                // Fermez la connexion une fois terminé
                inputStream.close();
                outputStream.close();
                connection.close();

                System.out.println("Client déconnecté : " + connection);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Liens

Normes

  • 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