Saltar a contenido

Use of an insecure Bluetooth connection

Uso de una conexión Bluetooth insegura

Descripción

La aplicación utiliza una conexión Bluetooth insegura, con el cifrado desactivado. Un atacante que se encuentre en las proximidades físicas de los dispositivos conectados puede usar un ataque Man in the Middle para interceptar y/o modificar los datos transmitidos.

Recomendación

Se recomienda utilizar medios seguros de conexión e intercambio de información con Bluetooth, lo que es posible con createRfcommSocketToServiceRecord y listenUsingRfcommWithServiceRecord que permiten cifrar la conexión de socket para mitigar el riesgo de ataques 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"; // Reemplace con la dirección MAC de su servidor
    private static final UUID SERIAL_UUID = new UUID(0x1101);

    public static void main(String[] args) {
        try {
            // Descubriendo y conectando al dispositivo servidor
            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);

            // Conectado con éxito, ahora puede leer y escribir datos a través de streamConnection

            // Cierre la conexión cuando haya terminado
            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 {
            // Crear un servidor Bluetooth
            LocalDevice localDevice = LocalDevice.getLocalDevice();
            localDevice.setDiscoverable(DiscoveryAgent.GIAC);

            // Cree una conexión de servidor y comience a escuchar
            String url = "btspp://localhost:" + SERIAL_UUID + ";name=" + SERVER_NAME;
            StreamConnectionNotifier connectionNotifier = (StreamConnectionNotifier) Connector.open(url);

            System.out.println("Servidor iniciado. Esperando a que se conecten los clientes...");

            // Escuchar las conexiones entrantes
            while (true) {
                StreamConnection connection = connectionNotifier.acceptAndOpen();

                // Manejar la conexión del cliente en un hilo separado
                Thread clientThread = new Thread(new ClientHandler(connection));
                clientThread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BluetoothStateException e) {
            e.printStackTrace();
        }
    }

    // Clase Runnable para manejar las conexiones de los clientes
    static class ClientHandler implements Runnable {
        private StreamConnection connection;

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

        @Override
        public void run() {
            try {
                System.out.println("Cliente conectado: " + connection);

                // Obtener los flujos de entrada y salida para la comunicación
                InputStream inputStream = connection.openInputStream();
                OutputStream outputStream = connection.openOutputStream();

                // Realice la comunicación con el cliente, por ejemplo, lea y escriba datos

                // Cierre la conexión cuando haya terminado
                inputStream.close();
                outputStream.close();
                connection.close();

                System.out.println("Cliente desconectado: " + connection);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Enlaces

Estándares

  • 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