Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
android-gadget — CVE-2022-20009 — описание и пример эксплойта для Android USB Gadgets | Kitploit
Инструменты/GitHubGitHub/szymonh/android-gadget
Безопасность AndroidБезопасность встроенных системАнализ уязвимостейЭксплуатацияАппаратная БезопасностьЭксплуатация Бинарных Файлов
GitHubszymonh/android-gadget

android-gadget

CVE-2022-20009 — описание и пример эксплойта для Android USB Gadgets

Репозиторий
53203 лет назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

android-gadget

Краткое описание

Некоторые ревизии ядра Linux, используемые в Android, подвержены проблеме CVE-2021-39685. Подробная информация и PoC для CVE-2021-39685 доступны в репозитории inspector-gadget.

Этот репозиторий включает PoC для нескольких специфических для Android USB-гаджетов, в том числе:

  • f_accessory
  • f_audio_source
  • f_gsi
  • f_mtp
  • f_qc_rndis
  • f_rmnet

Описание

a) f_accessory

  • Буфер EP0, выделенный в composite.c, имеет размер USB_COMP_EP0_BUFSIZ (4096) байт.
  • Обработчик управления передачей функции acc_ctrlrequest читает ctrl->wLength в w_length.
  • Для bRequest ACCESSORY_SEND_STRING или ACCESSORY_SEND_HID_EVENT значение устанавливается в w_length.
  • Длина фазы передачи данных устанавливается как cdev->req->length = value;
  • Передача данных приводит к переполнению буфера на wLength - 4096 байт.
  • Количество данных, записанных в буфер EP0 и за его пределы, контролируется атакующим.
int acc_ctrlrequest(struct usb_composite_dev *cdev,
				const struct usb_ctrlrequest *ctrl)
{
	struct acc_dev	*dev = get_acc_dev();
	int	value = -EOPNOTSUPP;
	struct acc_hid_dev *hid;
	int offset;
	u8 b_requestType = ctrl->bRequestType;
	u8 b_request = ctrl->bRequest;
	u16	w_index = le16_to_cpu(ctrl->wIndex);
	u16	w_value = le16_to_cpu(ctrl->wValue);
	u16	w_length = le16_to_cpu(ctrl->wLength);
	unsigned long flags;
    ...
	if (b_requestType == (USB_DIR_OUT | USB_TYPE_VENDOR)) {
        ...
        } else if (b_request == ACCESSORY_SEND_STRING) {
			dev_info(&cdev->gadget->dev, "%s: got ACCESSORY_SEND_STRING(52) request\n",
				__func__);
			schedule_work(&dev->sendstring_work);
			dev->string_index = w_index;
			cdev->gadget->ep0->driver_data = dev;
			cdev->req->complete = acc_complete_set_string;
			value = w_length;
            ...
		} else if (b_request == ACCESSORY_SEND_HID_EVENT) {
			spin_lock_irqsave(&dev->lock, flags);
			hid = acc_hid_get(&dev->hid_list, w_value);
			spin_unlock_irqrestore(&dev->lock, flags);
			if (!hid) {
				value = -EINVAL;
				goto err;
			}
			cdev->req->context = hid;
			cdev->req->complete = acc_complete_send_hid_event;
			value = w_length;
		}
...
	if (value >= 0) {
		cdev->req->zero = 0;
		cdev->req->length = value;
		value = usb_ep_queue(cdev->gadget->ep0, cdev->req, GFP_ATOMIC);
		if (value < 0)
			ERROR(cdev, "%s setup response queue error\n",
				__func__);
	}

b) f_audio_source

  • Буфер EP0, выделенный в composite.c, имеет размер USB_COMP_EP0_BUFSIZ (4096) байт.
  • Обработчик управления передачей функции audio_setup читает ctrl->wLength в w_length.
  • Для bRequestType, удовлетворяющего условию USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT, переменная value присваивается возвращаемому значению audio_set_endpoint_req.
  • audio_set_endpoint_req возвращает wLength для bRequest, равного UAC_SET_CUR, UAC_SET_MIN, UAC_SET_MAX или UAC_SET_RES.
  • Длина фазы передачи данных устанавливается как value; req->length = value;
  • Передача данных приводит к переполнению буфера на wLength - 4096 байт.
  • Количество данных, записанных в буфер EP0 и за его пределы, контролируется атакующим.
static int
audio_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
{
	struct usb_composite_dev *cdev = f->config->cdev;
	struct usb_request *req = cdev->req;
	int value = -EOPNOTSUPP;
	u16 w_index = le16_to_cpu(ctrl->wIndex);
	u16 w_value = le16_to_cpu(ctrl->wValue);
	u16 w_length = le16_to_cpu(ctrl->wLength);

    /* composite driver infrastructure handles everything; interface
	 * activation uses set_alt().
	 */
	switch (ctrl->bRequestType) {
	case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
		value = audio_set_endpoint_req(f, ctrl);
		break;
	case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
		value = audio_get_endpoint_req(f, ctrl);
		break;
	}
	/* respond with data transfer or status phase? */
	if (value >= 0) {
		pr_debug("audio req%02x.%02x v%04x i%04x l%d\n",
			ctrl->bRequestType, ctrl->bRequest,
			w_value, w_index, w_length);
		req->zero = 0;
		req->length = value;
		req->complete = audio_control_complete;
		value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
		if (value < 0)
			pr_err("audio response on err %d\n", value);
	}
static int audio_set_endpoint_req(struct usb_function *f,
		const struct usb_ctrlrequest *ctrl)
{
	int value = -EOPNOTSUPP;
	u16 ep = le16_to_cpu(ctrl->wIndex);
	u16 len = le16_to_cpu(ctrl->wLength);
	u16 w_value = le16_to_cpu(ctrl->wValue);
	pr_debug("bRequest 0x%x, w_value 0x%04x, len %d, endpoint %d\n",
			ctrl->bRequest, w_value, len, ep);
	switch (ctrl->bRequest) {
	case UAC_SET_CUR:
	case UAC_SET_MIN:
	case UAC_SET_MAX:
	case UAC_SET_RES:
		value = len;
		break;
	default:
		break;
	}
	return value;
}

c) f_gsi

  • Буфер EP0, выделенный в composite.c, имеет размер USB_COMP_EP0_BUFSIZ (4096) байт.
  • Обработчик управления передачей функции gsi_setup читает ctrl->wLength в переменную w_length.
  • Для bRequest, установленного в USB_CDC_SEND_ENCAPSULATED_COMMAND, значение устанавливается в w_length.
  • Длина фазы передачи данных устанавливается как value; req->length = value;
  • Передача данных приводит к переполнению буфера на wLength - 4096 байт.
  • Количество данных, записанных в буфер EP0 и за его пределы, контролируется атакующим.
static int
gsi_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
{
	struct f_gsi *gsi = func_to_gsi(f);
	struct usb_composite_dev *cdev = f->config->cdev;
	struct usb_request *req = cdev->req;
	int id, value = -EOPNOTSUPP;
	u16 w_index = le16_to_cpu(ctrl->wIndex);
	u16 w_value = le16_to_cpu(ctrl->wValue);
	u16 w_length = le16_to_cpu(ctrl->wLength);
	struct gsi_ctrl_pkt *cpkt;
	u8 *buf;
	u32 n;
	bool line_state;
    ...
    switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
    ...
	case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
			| USB_CDC_SEND_ENCAPSULATED_COMMAND:
		log_event_dbg("USB_CDC_SEND_ENCAPSULATED_COMMAND");
		if (w_value || w_index != id)
			goto invalid;
		/* read the request; process it later */
		value = w_length;
		req->context = gsi;
		if (gsi->prot_id == IPA_USB_RNDIS)
			req->complete = gsi_rndis_command_complete;
		else
			req->complete = gsi_ctrl_cmd_complete;
		/* later, rndis_response_available() sends a notification */
		break;
    ...
    ...
    /* respond with data transfer or status phase? */
	if (value >= 0) {
		log_event_dbg("req%02x.%02x v%04x i%04x l%d",
			ctrl->bRequestType, ctrl->bRequest,
			w_value, w_index, w_length);
		req->zero = (value < w_length);
		req->length = value;
		value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
		if (value < 0)
			log_event_err("response on err %d", value);
	}

d) f_mtp

  • Буфер EP0, выделенный в composite.c, имеет размер USB_COMP_EP0_BUFSIZ (4096) байт.
  • Обработчик управления передачей функции mtp_ctrlrequest читает ctrl->wLength в w_length.
  • Для bRequest, установленного в MTP_REQ_CANCEL, значение устанавливается в w_length.
  • Длина фазы передачи данных устанавливается как value; req->length = value;
  • Передача данных приводит к переполнению буфера на wLength - 4096 байт.
  • Количество данных, записанных в буфер EP0 и за его пределы, контролируется атакующим.
Скачать инструмент