Специалисты из SEC Consult обнаружили вопиющую уязвимость на всех роутерах, поддерживающих данную технологию — переполнение буфера на стеке в режиме ядра, которое может привести к удаленному выполнению кода.
Модуль ядра NetUSB.ko, который прослушивает порт 20005, даже если в роутер не подключено ни одного USB-устройства, для аутентификации использует шифрование AES со статическим ключом (который, конечно же, есть и в ПК-клиенте), что уже позволяет злоумышленнику удаленно воспользоваться подключенным USB-устройством. Однако, главная уязвимость заключается в фиксированном размере буфера для имени компьютера в функции run_init_sbus(), принимающего не более 64 символов. Переполнение этого буфера и приводит к переполнению стека в ядре
:
int computername_len;
char computername_buf[64];
// connection initiation, handshake
len = ks_recv(sock, &computername_len, 4, 0);
// ...
len = ks_recv(sock, computername_buf, computername_len, 0); // boom!
Уязвимость присутствует во многих популярных и современных роутерах. Производители используют разные маркетинговые имена для функциональности NetUSB: у NetGear она называется ReadySHARE, а другие просто называют ее «общий доступ к принтеру» или «общий доступ к USB-порту».
Уязвимость подтверждена на следующих роутерах, с последней версией прошивки:
- TP-Link TL-WDR4300 V1
- TP-Link WR1043ND v2
- NETGEAR WNDR4500
Хоть NetUSB на этих роутерах работает только на LAN-портах, исследователи обнаружили некоторое количество открытых портов 20005 в интернете. Пока неясно, произошло ли это из-за неправильных настроек по умолчанию, или же пользователи сами открыли доступ извне.
NETGEAR AC1450
NETGEAR CENTRIA (WNDR4700/4720)
NETGEAR D6100
NETGEAR D6200
NETGEAR D6300
NETGEAR D6400
NETGEAR DC112A
NETGEAR DC112A (Zain)
NETGEAR DGND4000
NETGEAR EX6200
NETGEAR EX7000
NETGEAR JNR3000
NETGEAR JNR3210
NETGEAR JR6150
NETGEAR LG6100D
NETGEAR PR2000
NETGEAR R6050
NETGEAR R6100
NETGEAR R6200
NETGEAR R6200v2
NETGEAR R6220
NETGEAR R6250
NETGEAR R6300v1
NETGEAR R6300v2
NETGEAR R6700
NETGEAR R7000
NETGEAR R7500
NETGEAR R7900
NETGEAR R8000
NETGEAR WN3500RP
NETGEAR WNDR3700v5
NETGEAR WNDR4300
NETGEAR WNDR4300v2
NETGEAR WNDR4500
NETGEAR WNDR4500v2
NETGEAR WNDR4500v3
NETGEAR XAU2511
NETGEAR XAUB2511
TP-LINK Archer C2 V1.0 (Fix planned before 2015/05/22)
TP-LINK Archer C20 V1.0 (Not affected)
TP-LINK Archer C20i V1.0 (Fix planned before 2015/05/25)
TP-LINK Archer C5 V1.2 (Fix planned before 2015/05/22)
TP-LINK Archer C5 V2.0 (Fix planned before 2015/05/30)
TP-LINK Archer C7 V1.0 (Fix planned before 2015/05/30)
TP-LINK Archer C7 V2.0 (Fix already released)
TP-LINK Archer C8 V1.0 (Fix planned before 2015/05/30)
TP-LINK Archer C9 V1.0 (Fix planned before 2015/05/22)
TP-LINK Archer D2 V1.0 (Fix planned before 2015/05/22)
TP-LINK Archer D5 V1.0 (Fix planned before 2015/05/25)
TP-LINK Archer D7 V1.0 (Fix planned before 2015/05/25)
TP-LINK Archer D7B V1.0 (Fix planned before 2015/05/31)
TP-LINK Archer D9 V1.0 (Fix planned before 2015/05/25)
TP-LINK Archer VR200v V1.0 (Fix already released)
TP-LINK TD-VG3511 V1.0 (End-Of-Life)
TP-LINK TD-VG3631 V1.0 (Fix planned before 2015/05/30)
TP-LINK TD-VG3631 V1.0 (Fix planned before 2015/05/31)
TP-LINK TD-W1042ND V1.0 (End-Of-Life)
TP-LINK TD-W1043ND V1.0 (End-Of-Life)
TP-LINK TD-W8968 V1.0 (Fix planned before 2015/05/30)
TP-LINK TD-W8968 V2.0 (Fix planned before 2015/05/30)
TP-LINK TD-W8968 V3.0 (Fix planned before 2015/05/25)
TP-LINK TD-W8970 V1.0 (Fix planned before 2015/05/30)
TP-LINK TD-W8970 V3.0 (Fix already released)
TP-LINK TD-W8970B V1.0 (Fix planned before 2015/05/30)
TP-LINK TD-W8980 V3.0 (Fix planned before 2015/05/25)
TP-LINK TD-W8980B V1.0 (Fix planned before 2015/05/30)
TP-LINK TD-W9980 V1.0 (Fix already released)
TP-LINK TD-W9980B V1.0 (Fix planned before 2015/05/30)
TP-LINK TD-WDR4900 V1.0 (End-Of-Life)
TP-LINK TL-WR1043ND V2.0 (Fix planned before 2015/05/30)
TP-LINK TL-WR1043ND V3.0 (Fix planned before 2015/05/30)
TP-LINK TL-WR1045ND V2.0 (Fix planned before 2015/05/30)
TP-LINK TL-WR3500 V1.0 (Fix planned before 2015/05/22)
TP-LINK TL-WR3600 V1.0 (Fix planned before 2015/05/22)
TP-LINK TL-WR4300 V1.0 (Fix planned before 2015/05/22)
TP-LINK TL-WR842ND V2.0 (Fix planned before 2015/05/30)
TP-LINK TL-WR842ND V1.0 (End-Of-Life)
TP-LINK TX-VG1530(GPON) V1.0 (Fix planned before 2015/05/31)
Trendnet TE100-MFP1 (v1.0R)
Trendnet TEW-632BRP (A1.0R)
Trendnet TEW-632BRP (A1.1R/A1.2R)
Trendnet TEW-632BRP (A1.1R/A1.2R/A1.3R)
Trendnet TEW-634GRU (v1.0R)
Trendnet TEW-652BRP (V1.0R)
Trendnet TEW-673GRU (v1.0R)
Trendnet TEW-811DRU (v1.0R)
Trendnet TEW-812DRU (v1.0R)
Trendnet TEW-812DRU (v2.xR)
Trendnet TEW-813DRU (v1.0R)
Trendnet TEW-818DRU (v1.0R)
Trendnet TEW-823DRU (v1.0R)
Trendnet TEW-MFP1 (v1.0R)
Zyxel NBG-419N v2
Zyxel NBG4615 v2
Zyxel NBG5615
Zyxel NBG5715
На данный момент только TP-LINK выпустил исправления уязвимости для некоторых моделей, еще 40 моделей получат обновление чуть позже. Некоторые производители позволяют отключить NetUSB, но, по крайней мере, в NetGear такая функциональность отсутствует: нельзя ни просто отключить, ни закрыть порт через firewall.
Ambir Technology
AMIT
Asante
Atlantis
Corega
Digitus
D-Link
EDIMAX
Encore Electronics
Engenius
Etop
Hardlink
Hawking
IOGEAR
LevelOne
Longshine
NETGEAR
PCI
PROLiNK
Sitecom
Taifa
TP-LINK
TRENDnet
Western Digital
ZyXEL
В KCodes невнятно отреагировали на сообщение об уязвимости, поэтому исследователи написали о ней напрямую производителям и CERT. Также ребята разработали PoC, который (пока) не опубликовали.
Информация об уязвимости
Информация на сайте CERT
Заметка об уязвимости в блоге SEC Consult
Комментарии (9)
Dywar
19.05.2015 22:12+6Крис Касперски "Ошибки переполнения буфера извне и изнутри".
Цитата — «много интересного текста до этого момента о C++ и динамических массивах… Даже если компилятор вдруг решит заняться контролем границ массива (одно дополнительное обращение к памяти и три-четыре машинных команды), это не решит проблемы, поскольку при обнаружении переполнения откомпилированная программа не сможет сделать ничего умнее, чем аварийно завершить свое выполнение. Вызов исключения не предлагается, поскольку если программист забудет его обработать (а он наверняка забудет это сделать), мы получим атаку типа отказ в обслуживании. Конечно, это не захват системы, но все равно нехорошо.
Так что ошибки переполнения были, есть и будут!»
Спасибо за пост.splav_asv
20.05.2015 01:10Одна тонкость — в данном случае язык C. При большом желании можно таки ошибки обрабатывать путём вменяемого прерывания обработки системного вызова с особождением всем памяти контекста. Вот если структура глобальная — тут сложнее, целую подсистему надо как-то погасить. Но и это, в принципе, возможно — лучше, чем ничего.
Iv38
20.05.2015 00:27+1Уязвимость существует в любых прошивках с данным модулем ядра? Это относится к OpenWrt, например?
ValdikSS Автор
20.05.2015 00:28+1В OpenWRT нет этого модуля ядра. Это проприетарная разработка.
Iv38
20.05.2015 01:46Ясно. А то я про этот NetUSB впервые слышу. И даже гугл не особо помог.
Klukonin
20.05.2015 09:36Есть USB over IP опенсорсный. И он даже работает. И даже под OpenWRT.
Только в нем отсутствуют методы аутентификации и защиты. И подразумевается что вы его используете в защищенной сети.
volnov
О боже, что же делать? Меня взломают?!
ValdikSS Автор