I caricabatterie più vecchi erano semplicemente un semplice alimentatore: poco più di un ponte a diodi, un condensatore e un regolatore di tensione. Hanno fornito una tensione costante al telefono, spesso + 5V. Quando la connettività USB è arrivata con i telefoni moderni, + 5V è diventato uno standard e i pin di alimentazione sull'header USB sono stati utilizzati per ricaricare lo stesso. I due pin di dati verrebbero lasciati fluttuanti o legati a terra e non verrebbero utilizzati.
In questi giorni le cose sono cambiate. I telefoni moderni sono dispositivi intelligenti assetati di energia, con grandi batterie. I vecchi standard USB limitano strongmente la quantità di corrente che può essere fornita a un dispositivo. Su una porta USB 1.1, è possibile disegnare fino a 100 mA di corrente sulla linea + 5V. Ciò equivale a 0,5 W, che certamente non è molto quando si carica. USB 2.0 ha aumentato questo valore a 500 mA e USB 3.0 lo ha aumentato ulteriormente fino a 900 mA. Tuttavia, il reale consumo di energia consentito non è così semplice: quando è appena inserito il massimo che un dispositivo può prelevare è solo 100mA / 150mA per USB 2.0 / 3.0 rispettivamente. Il dispositivo deve designarsi su un particolare tipo , così come il dock su cui è collegato. Questo è chiamato una negoziazione.
Ci sono tre tipi principali di alimentazione per USB:
- Modalità No Dead Battery (NDB): consente di disegnare 100 mA (150 mA su USB3) quando viene collegato a un dispositivo senza alcuna negoziazione. Nessun dato può essere trasferito.
- Modalità caricatore host - consente 100 mA su USB 1.1, 500 mA su USB 2.0 e 900 mA su USB 3.0 dopo che il dispositivo è stato registrato con l'host e possono verificarsi comunicazioni full duplex. Questa è la modalità "normale" in cui la maggior parte dei dispositivi entrerà quando viene collegata a un computer.
- Modalità caricatore dedicato - definita solo per USB 2.0 e 3.0 e consente 1,5 A su un dispositivo di ricarica dedicato. Mentre in questa modalità, nessun dato può essere trasferito. Tuttavia, il dispositivo deve negoziare questa modalità con il caricabatterie.
Si noti che possono essere disegnati solo 150 mA dal dispositivo quando non si è verificata alcuna negoziazione. Questa è una funzione di sicurezza, poiché la protezione da sovracorrente su un dispositivo può comportare fusibili montati sulla superficie che richiedono la dissaldatura per la sostituzione. Pertanto, se un dispositivo tenta di estrarre 1.5 A su un host USB 1.1 che supporta solo 100 mA, probabilmente si fonderà l'host. In quanto tale, dobbiamo fare una negoziazione corretta, che comporta alcuni trasferimenti di dati.
Ecco dove le cose si confondono:
- La fase di negoziazione può essere implementata in hardware, firmware o software. Di solito il primo passo è l'hardware, quindi il passo successivo è il firmware e il passaggio finale (riconoscimento del sistema operativo tramite PnP) è software.
- I dati coinvolti nell'handshake iniziale di negoziazione non implicano (per quanto ne so io) alcun buffer di lunghezza arbitraria. È in questa fase che coinvolge la negoziazione di potere.
- I dati coinvolti nella negoziazione completa di Plug-n-Play sono complicati e quasi certamente implicano buffer di lunghezza arbitrari.
Per questo motivo, i moderni caricatori dedicati di solito hanno un piccolo microcontrollore o un chip host USB dedicato per affrontare la fase di negoziazione. Ciò significa che di solito c'è una superficie di attacco basata sul firmware sul caricatore e sicuramente sul dispositivo. Tuttavia, alcuni caricabatterie specializzati (ad esempio iPhone) imbrogliano le specifiche utilizzando trucchi di rilevamento (ad esempio il rilevamento capacitivo sulle linee dati) per rendere la produzione del caricatore più economica, e quindi non è necessario eseguire alcun trasferimento di dati. Questo può o meno essere una violazione delle specifiche USB, ma le grandi aziende tendono ad essere in grado di ottenere cose come quelle autorità normative precedenti.
Il lato di ricarica wireless funziona quasi allo stesso modo, tranne che il trasferimento effettivo della corrente avviene tramite un campo elettromagnetico oscillante. La negoziazione funziona allo stesso modo, proprio sopra un canale di comunicazione in stile NFC . Se potessi inserire dati in quel canale di comunicazione, potresti alterare il modo in cui funziona la negoziazione, ma dubito che potresti fare qualcosa di interessante senza violare il protocollo. Un modo interessante di ricerca sarebbe vedere se alcuni dispositivi hanno buffer overflow o problemi simili nel protocollo.
Quindi, in conclusione, potrebbe essere in grado di trovare un exploit per un dispositivo, ma è probabile che non faccia altro che mettere temporaneamente in pausa l'IC del controller USB sul dispositivo. In alternativa, è possibile sostituire il caricabatterie con un host attivo e utilizzarlo per negoziare completamente con il dispositivo e inviare comandi. Ciò è particolarmente pericoloso su dispositivi iPhone e Android che hanno il debug USB abilitato, in quanto consente l'accesso alla memoria del dispositivo.