Los cargadores antiguos solían ser simplemente una fuente de alimentación, poco más que un puente de diodo, un condensador y un regulador de voltaje IC. Suministraban una tensión constante al teléfono, a menudo + 5V. Cuando la conectividad USB llegó con los teléfonos modernos, + 5V se convirtió en un estándar y las clavijas de suministro en el encabezado USB se usaron para cargar de la misma manera. Los dos pines de datos se dejarían flotando o atados al suelo, y no se utilizarían.
En estos días las cosas han cambiado. Los teléfonos modernos son dispositivos inteligentes que consumen mucha energía, con baterías grandes. Los antiguos estándares USB limitan en gran medida la cantidad de corriente que se puede suministrar a un dispositivo. En un puerto USB 1.1, puede consumir hasta 100 mA de corriente en la línea de + 5V. Esto equivale a 0.5W, que ciertamente no es mucho cuando se carga. El USB 2.0 aumentó esto a 500mA, y el USB 3.0 lo aumentó aún más a 900mA. Sin embargo, el consumo real de energía permitido no es tan simple: cuando se enchufa, el máximo que se permite retirar un dispositivo es de solo 100mA / 150mA para USB 2.0 / 3.0, respectivamente. El dispositivo debe designarse a sí mismo para un tipo particular, al igual que el dock al que está conectado. Esto se llama una negociación.
Hay tres tipos principales de estado de alimentación para USB:
- Modo sin batería muerta (NDB): permite extraer 100 mA (150 mA en USB3) cuando se enchufa en un dispositivo sin ninguna negociación. No se pueden transferir datos.
- Modo de cargador de host: permite 100mA en USB 1.1, 500mA en USB 2.0 y 900mA en USB 3.0 después de que el dispositivo se haya registrado con el host, y pueden ocurrir comunicaciones dúplex completas. Este es el modo "normal" en el que se encuentran la mayoría de los dispositivos cuando están conectados a una computadora.
- Modo de cargador dedicado: solo se define para USB 2.0 y 3.0, y permite 1.5A en un dispositivo de cargador dedicado. Mientras que en este modo, no se pueden transferir datos. Sin embargo, el dispositivo debe negociar este modo con el cargador.
Observe que el dispositivo solo puede extraer 150 mA cuando no se ha producido ninguna negociación. Esta es una característica de seguridad, ya que la protección contra sobrecargas en un dispositivo puede involucrar fusibles de montaje en superficie que requieren de la soldadura para reemplazar. Como tal, si un dispositivo intentara extraer 1.5A en un host USB 1.1 que solo admite 100 mA, es probable que se derrita el host. Como tal, tenemos que hacer una negociación adecuada, lo que implica cierta transferencia de datos.
Aquí es donde las cosas se ponen borrosas:
- La fase de negociación puede implementarse en hardware, firmware o software. Por lo general, el primer paso es el hardware, luego el siguiente es el firmware y el último paso (reconocimiento del sistema operativo a través de PnP) es el software.
- Los datos implicados en el protocolo de negociación inicial no implican (por lo que yo sé) ningún búfer de longitud arbitraria. Es esta etapa la que implica la negociación de poder.
- Los datos involucrados en la negociación completa de Plug-n-Play son complicados y ciertamente involucran buffers de longitud arbitraria.
Como tales, los cargadores dedicados modernos usualmente tienen un pequeño microcontrolador o un chip host USB dedicado para lidiar con la fase de negociación. Esto significa que generalmente hay una superficie de ataque basada en firmware en el cargador, y definitivamente en el dispositivo. Sin embargo, algunos cargadores especializados (por ejemplo, iPhone) engañan la especificación utilizando trucos de detección (por ejemplo, detección capacitiva en las líneas de datos) para abaratar la producción del cargador, y por lo tanto no necesitan realizar ninguna transferencia de datos. Esto puede o no ser una violación de la especificación de USB, pero las grandes empresas tienden a ser capaces de obtener cosas como las de los organismos reguladores del pasado.
El lado de carga inalámbrica funciona casi de la misma manera, excepto que la transferencia real de corriente se realiza a través de un campo electromagnético oscilante. La negociación funciona de la misma manera, justo a través de un canal de comunicaciones de estilo NFC de NFC. Si pudiera inyectar datos en ese canal de comunicaciones, podría alterar la forma en que funciona la negociación, pero dudo que pueda hacer algo interesante sin violar el protocolo. Una interesante vía de investigación sería ver si algún dispositivo tiene desbordamientos de búfer o problemas similares en el protocolo.
Entonces, en conclusión, es posible que pueda encontrar una vulnerabilidad para un dispositivo, pero es probable que no haga nada más que bloquear temporalmente el IC del controlador USB en el dispositivo. Alternativamente, puede reemplazar el cargador con un host activo y usarlo para negociar completamente con el dispositivo y enviarle comandos. Esto es especialmente peligroso en dispositivos iPhone y Android que tienen habilitada la depuración USB, ya que permite acceder a la memoria del dispositivo.