В прошлой статье я писал, как в линуксе написать драйвер для графического планшета. Но на том история не закончилась: вместе с планшетом я купил и ноутбук, на котором установлен сканер отпечатков. Сканер новый, такой, как повсеместно стоит на мобильных телефонах, маленькая прямоугольная площадка на тачпаде.

Драйвера только для Windows 10, и только на сайте производителя ноутбука. Сразу возникла мысль если и не завести его в линуксе, то хотя бы понять, как же он работает. Висит сканер на usb, вместе с тачпадом.

Для начала сделаем lsusb и посмотрим, как определяется наш сканер:

Bus 001 Device 006: ID 04f3:0c03 Elan Microelectronics Corp. 

Смотрим более подробно информацию о нем.
Bus 001 Device 006: ID 04f3:0c03 Elan Microelectronics Corp.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x04f3 Elan Microelectronics Corp.
idProduct 0x0c03
bcdDevice 1.38
iManufacturer 1 ELAN
iProduct 2 ELAN:Fingerprint
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 62
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 5
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
** UNRECOGNIZED: 09 21 10 01 00 01 22 15 00
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x03 EP 3 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
can't get device qualifier: Resource temporarily unavailable
can't get debug descriptor: Resource temporarily unavailable
Device Status: 0x0000
(Bus Powered)

Тут нас ждет первое разочарование: сканер работает через bulk-transfer. Если в HID формат данных определен в дескрипторе, то тут — тёмный лес, можно пихать всё, что придет в голову. Что делать?

Перезагружаюсь в Windows 10, ставлю Wireshark, запускаю запись всего трафика USB. Дальше в настройках Windows иду в меню, где устанавливаются отпечатки для входа в систему. Регистрирую один палец, выхожу. Выключаю запись в Wireshark, сохраняю полученный дамп. Снова перезагружаюсь в Linux.

Снова запускаю Wireshark, открываю дамп, фильтрую по нужным vid/pid, нахожу искомый сканер.

Среди всей кучи явно выделяются отдельные «жирные» пакеты, больше 16 килобайт:



Смотрю, что там. На первый взгляд мусор, ничего определенного. Сохранил данные такого пакета отдельным файлом, 18432 байта, сделал xxd ./image.raw, увидел примерно такое:

0000000: 4123 d328 4828 8d28 aa28 6028 5f29 a528
0000010: f028 1127 ef26 ff27 8129 2628 9d23 9621
0000020: 1d21 d126 db26 aa26 b128 2326 8826 d027
0000030: a226 8925 2120 af1c fa1c 341b b31f 1122  
0000040: 1e27 8526 5026 ac26 4f26 fa26 1126 9225 
...

Тут сразу в глаза бросились некие чередующиеся пары байт, это очень неспроста. Было сделано предположение, что этот блок не что иное, как 16-битная квадратная картинка, поскольку старший байт случаен, а вот младший плавает совсем немного — весьма характерно для однотонного изображения, коим является отпечаток. Догадку подтвердил расчет, sqrt(18432bytes / (16bit /8)) = 96. Квадратная картинка со стороной 96 пикселей?

Пробуем перегнать равку в изображение:

convert -depth 16 -size 96x96+0 gray:image.raw ./out.png

Успех с первого раза! На выходе получаем картинку, содержащую полноценный отпечаток. Я раньше думал, что аналитика уже встроена в современные сенсоры, и отпечатки его не покидают, вылезает некий хеш… Но нет. Вылезает отпечаток, причем в довольно неплохом качестве. Постить выхлоп сюда не буду по понятным причинам.

Теперь надо это дело автоматизировать, чтобы до конца понять, как же оно работает. Для этого нам будет нужна libusb.

Покопавшись в дампе трафика, я понял, что для того, чтобы забрать скан пальца, надо отправить 0х0009 на endpoint 0x82. Однако тут оказалась засада — сканер отдавал картинку сразу, не ожидая пальца на себе. Ну, черные квадраты такие.

Пришлось ковырять трафик дальше. Выяснилось, что перед получением картинки надо послать 0x403f на endpoint 0x83 и ждать один байт от сканера. Когда сканер выплюнет 0х55, можно запускать сканирование, палец в этот момент на сканере.



Делаем шаблонный Makefile
CC	= gcc
LD	= gcc
OPT 	= -O1 -s 
CFLAGS 	= $(OPT) -c -I/usr/include/libusb-1.0
LDFLAGS	= -DPTW32_STATIC_LIB $(OPT)
LIBS	= -lrt -lusb-1.0

all:
	$(CC) $(CFLAGS) elanfp.c -o elanfp.o
	$(LD) $(LDFLAGS) elanfp.o $(LIBS) -o elanfp

clean: 
	rm -f *.o elanfp


И вот такой вот файлик elanfp.c.
#include <stdio.h>    
#include <stdlib.h>    
#include <sys/types.h> 
#include <errno.h>
#include <string.h>
#include <libusb.h> 

#define BULK_EP_OUT1     0x82   
#define BULK_EP_OUT2     0x83
#define BULK_EP_IN       0x01

#define IMAGE_PACKET_SIZE (96 * 96 * 2)
char img_buf[IMAGE_PACKET_SIZE];

char cmd01[2] = { 0x40, 0x3f };
char cmd02[2] = { 0x00, 0x09 };

int write_to_file(char* buf, int size) {
    FILE *fp;
    fp = fopen("./out.fp","w");
    if (fp < 0) return 1;
    fwrite(buf, 1, size, fp);
    fclose(fp);
    return 0;
}

int main() {
    int r0, i, devs_count = 0, libusb_config = 0, transferred = 0;
    
    struct libusb_device **devs;
    struct libusb_device *dev;
    struct libusb_device_descriptor desc;
    struct libusb_device_handle *handle = NULL;
    
    r0 = libusb_init(NULL);
    if (r0 < 0) return 1;
    
    devs_count = libusb_get_device_list(NULL, &devs);
    if (devs_count < 0) {
        libusb_exit(NULL);
        printf("Error %d\n", r0);
        return 2;
    }
    
    while (1) {
        dev = devs[i];
        if (dev != NULL) {
            r0 = libusb_get_device_descriptor(dev, &desc);
            if (r0 < 0) continue;

            if ((desc.idVendor == 0x04f3) && (desc.idProduct == 0x0c03)) {
                r0 = 0;
                printf("Device with vid %x pid %x found.\n", desc.idVendor, desc.idProduct);
                break;
            }
        } else {
            r0 = 3;
            break;
        }
        
        i++;
        if (i > devs_count) {
            r0 = 99;
            goto app_exit;
        }
    }
    
    if (r0 != 0) goto app_exit;
    
    /*****************************************************/
    
    r0 = libusb_open(dev, &handle);
    if (r0 < 0) {
        r0 = 5;
        goto app_exit;
    }
    
    r0 = libusb_get_configuration(handle, &libusb_config);
    if (r0 != 0) {
        r0 = 98;
        goto app_exit_2;
    }
    
    printf("Config number is %d\n", libusb_config);
    
    if (libusb_config > 1) {
        r0 = libusb_set_configuration(handle, 1);
        if (r0 != 0) {
            r0 = 97;
            goto app_exit_2;
        }
        printf("Config set to 1\n");
    }
    
    if (libusb_kernel_driver_active(handle, 0) == 1) {
        if(libusb_detach_kernel_driver(handle, 0) != 0) {
            r0 = 96;
            goto app_exit_2;
        }
    }
    
    r0 = libusb_claim_interface(handle, 0);
    if (r0 != 0) {
        r0 = 95;
        goto app_exit_2;
    }
    
    r0 = libusb_bulk_transfer(handle, BULK_EP_IN, cmd01, 2, &transferred, 0);
    if((r0 == 0) && (transferred == 2)) {
        printf("CMD1 sent\n");
    }
    
    r0 = libusb_bulk_transfer(handle, BULK_EP_OUT2, img_buf, 1, &transferred, 0); // wait for press
    printf("Received byte %d\n", img_buf[0]);
    
    r0 = libusb_bulk_transfer(handle, BULK_EP_IN, cmd02, 2, &transferred, 0);
    if((r0 == 0) && (transferred == 2)) {
        printf("CMD2 sent\n");
    }
    
    r0 = libusb_bulk_transfer(handle, BULK_EP_OUT1, img_buf, IMAGE_PACKET_SIZE, &transferred, 0);
    printf("Received %d\n", transferred);
    write_to_file(img_buf, IMAGE_PACKET_SIZE);
    
    system("convert -depth 16 -size 96x96+0 gray:out.fp ./out.png");
    system("rm ./out.fp");
    
app_exit_2:
    libusb_close(handle); 
    
    /*****************************************************/
    
app_exit:
    libusb_free_device_list(devs, 1);
    libusb_exit(NULL);
    
    if (r0 != 0) {
        printf("Error %d\n", r0);
    }
    
    return r0;
}


Код работы с libusb шаблонный, взятый частично из мануала, частично с SO. Собираем, запускаем, радуемся картинке с отпечатком в папке с кодом.

Дальше, когда тестовый код был закончен, я закинул его в список рассылки libfprint — к сожалению, многие линуксовые проекты недокументированны, и разбираться, как добавить свой код — тот еще квест. Просто нет столько времени.

Так что буду надеятся, что авторы добавят этот код к проекту.

Вообще, несколько удивило то, что отпечатки приходят просто картинкой и обрабатываются в юзерспейсе. Безопасность? Нет, не слышали. На мой взгляд, отпечатки не должны покидать сканер, к системе должен вылетать некий хеш, уникальный для сканера, но никак не сырая картинка. Да, отпечатки публичны, но одно дело собирать их по одному в реальном мире, и совершенно другое — найти уязвимость в ПО и сливать готовые отпечатки миллионами…

Комментарии (60)


  1. dartraiden
    27.11.2017 18:42

    Вспоминается история с отпечатками на смартфонах HTC


  1. vassabi
    27.11.2017 18:55

    Мда…
    Получается: взломай винду, если там есть камера — получи фотографию, если сканер отпечатков — отпечаток пальца. Интересно, насколько сложно потом этим с добром залогиниться в айфон?


    1. vvzvlad
      27.11.2017 21:15

      Сложно. Ну получили вы картинку, и что? Вы попробуй н вы засунуть в родной софт этого сканера сначала. А в айфон ещё сложнее, так как он картинки на вход не принимает, надо муляж пальца делать


      1. Dmitri-D
        28.11.2017 06:09

        и 3D принтером можно сделать палец с таким отпечатком


        1. lolhunter
          28.11.2017 10:55

          3д принтер не панацея.
          1) Не хватит точности. У FDM 100% не выйдет.
          2) Где модельку возьмем?


          1. Dmitri-D
            29.11.2017 02:46

            Какие-то злобные местные парни ставят -1 за всё подряд. Может ума не хватает понять о чем речь, а может просто новые российские традиции «злоба против всех». Эта фраза — тест на ум, парни. Кликайте минус, если вы умны.

            По сути вопроса — 3д точности в 0.05 вполне хватит и такие принтеры уже доступны. Модель не нужна — достаточно сделать небольшую пластинку, на которой будет квадратик с борозками повторяющими рисунок. И это только для сканеров отпечатков, которые учитывают рельеф. Те, которые не учитывают — достаточно просто распечатки на обычном 2д принтере.


            1. lolhunter
              29.11.2017 10:56

              Ты на гиктаймсе xD Карму сливают за то, что ты отвечаешь не в тренде.
              Я прекрасно понял что вы имели ввиду, но у меня достаточно большой опыт работы с 3D печатью и скажу, что так не получится.
              По пунктам:
              1) Точность позиционирования не равно минимальному размеру элемента. Точность 0,05 означает, что одна линия может отстоять от другой на 0,05мм. Но вы мне можете напечатать точку 0,05 на 0,05.
              Грубо минимальный размер элемента у 3д принтера = диаметру сопла вдоль направления движения и x4-5 поперек — потому что головка как бы размазывает и она не может подать и сразу вытянуть что бы сделать точку. У всей системы большая инерция. То есть при сопле 0,4мм у вас линии будут минимум 0,4 мм. Можно попробовать найти сопло 0,1мм и напечатать рисунок в 1 слой без откатов, но это подойдет далеко не для всех отпечатков.
              2) Слои размазываются, что еще увеличивает толщину линии, но уменьшает толщину слоя. Не сильно, но для отпечатка пальца — важно.
              3) Точность слоя не равно точности печати на этом слое. Верхний слой «замазывают» и получают глянец. Слои довольно «рифленые». Для обычной печати это не важно, но для отпечатка пальца — очень.
              В общем и целом 3Д принтеры это не панацея. Все их чуть ли не для производства использовать хотят, хотя по факту они идеальны разве что для пототипов.


              1. vassabi
                29.11.2017 12:57

                так понятно, что не расплавленным пластиком печатать, а фотополимерами


            1. mayorovp
              30.11.2017 10:12

              Я понимаю почему иногда ругаются на "минусаторов" те, у кого рейтинг комментария -3 и ниже. Но откуда пошла мода ругаться на минусы тому, чей комментарий имеет положительный рейтинг?


              Ваш комментарий выглядел бы намного красивее без первого абзаца.


      1. Rumlin
        28.11.2017 08:16

        Умелец использовал столярный клей и спрей с графеном, чтобы изготовить фальшивый палец, повторяющий отпечаток, оставленный на поверхности смартфона.

        Хакер скопировал отпечатки пальцев по обычной фотографии


      1. Compost
        28.11.2017 09:50

        Сделать муляж с картинки никиких проблем не оставляет. Любая рекламная фирма выпускает печати тоннами. Процесс несложный и воспроизводим.


        1. miga
          28.11.2017 16:14

          Занимался одно время изготовлением печатей (фотолитография) и мне кажется, что едва ли что-то получится дельное — не хватит разрешающей способности. Если честно, и обычные-то печати получались хорошо если со второй попытки — очень капризная технология :)


      1. MooNDeaR
        28.11.2017 09:50

        А кто-нибудь в курсе, FaceID на фотографию среагирует? :)


        1. roboter
          28.11.2017 10:33

          на 3х мерную среагирует, взломали быстро.


  1. Rumlin
    27.11.2017 19:02

    Тоже предполагал, что наружу выдаётся некий ключ. Логика производства понятно — так дешевле. Должна появиться некая сертификация безопасности таких устройств. И производитель должен будет указывать к какому классу защиты информации относится его устройство.


    1. Marsikus
      28.11.2017 09:00

      Всё просто, сейчас есть устройства с сертификацией безопасности и «все остальные». Вот во всех остальных и применяются такие себе действующие макеты средств безопасности как это.


    1. Unit
      28.11.2017 16:41

      Работал с устройствами одной фирмы, там отдается хеш-сумма. Картинку тоже можно получить, но проверка пальца производится по хеш-сумме.


  1. eagleivg
    27.11.2017 19:34

    Вот таки да, если в будущем введут трех-факторную авторизацию, то что будет при компрометации отпечатка? Подавать заявление в поликлинику на перегенерацию паппилярного узора?


    1. vvzvlad
      27.11.2017 21:12

      К сожалению, это возможно только вместе с перегенерацией человека. Пройдите в кабинку для самоубийств.


      1. ProstoTyoma
        27.11.2017 22:20
        -1

        CRISPR/Cas9 нам поможет. Можно будет даже папиллярным узором какой-нибудь логотип нарисоваьб =)


        1. vvzvlad
          27.11.2017 22:30

          Ох уж это новая мода списывать все непонятное на ДНК. Вы всерьёз думаете, что текстура вашей кожи задается генетикой?


          1. dabar347
            27.11.2017 22:40

            Развитие всех тканей задается генетикой. В том числе и отпечатков. Если бы тут внешние факторы играли роль, то отпечатки должны меняться; причем довольно часто


            1. vvzvlad
              27.11.2017 22:50

              С чего это они должны меняться? Вам часто отрывает руку и вы выращиваете себе новую?


              1. dabar347
                27.11.2017 23:52

                Так клетки кожи очень часто обновляются напомню


                1. vvzvlad
                  28.11.2017 00:03

                  Вы бы того… погуглили, что-ли. Перед тем, как что-нибудь в комментариях писать.
                  Ну, знаете, школьные такие вопросы: За что отвечает ДНК, что такое генотип и фенотип, какие слои кожи есть, какие из них отвечают за отпечатки, а в каких из них есть «клетки кожи», которые «очень часто обновляются напомню».


                  1. dabar347
                    28.11.2017 03:31

                    Ну раз мы так начинаем, ну давай. Папиллярный узор можно назвать частью фенотипа? Вполне. Меняется ли он в течении жизни? Как бы нет. (при чем тут только фенотип, просто чтобы приплести?)

                    Какие слои кожи: узор — внешний слой дермы (он же Papillary dermis). Большей частью соединительная ткань. Основные клетки — фибробласты — обновляются на 50 процентов примерно за 10 лет. Где моя мысль до этого была не верна

                    Если бы в течение 10 лет у человека менялся узор тогда можно было бы говорить что он зависит от факторов среды. Но этого не происходит. Вам в интернете лишь бы спиздануть что-нибудь


                    1. p_fox
                      28.11.2017 14:38

                      "Развитие всех тканей задается генетикой."
                      Тогда почему у однояйцевых близнецов отпечатки пальцев разные?


                    1. vvzvlad
                      28.11.2017 18:53
                      +1

                      Ох, черт, простите меня. Когда я говорил «погуглите», я забыл добавить, что надо еще и понять то, что нагуглили. Без этого ничего не работает.
                      И это… «давайте», а не «давай». Я с вами не пил, чтобы на ты переходить.

                      Паппилярный узор — часть фенотипа. Определенно. Все ваше тело — это фенотип, собственно. Но является ли узор на пальцах частью генотипа? Вопрос.
                      Как мы знаем со школьного курса биологии, у однояйцовых(монозиготных) близнецов генотип одинаковый — ибо, как следует из названия, такие близнецы развиваются из одной оплодотворенной яйцеклетки, которая по каким-то причинам после начала деления разделилась на две(или больше) независимые клетки. Значит, следуя простой логике, у однояйцовых близнецов в таком случае отпечатки пальцев должны быть одинаковые или хотя бы похожие до степени смешения, правильно?
                      Простой запрос в гугле находит интересную статью по нашей теме и там таки написано, что нет, у монозиготных близнецов отпечатки разные, хоть и похожие по некоторым факторам:

                      Routine forensic DNA analysis is useless in the case of identical twins, which has in fact led to several cases of modern-day twins who blame each other for the crime.(3–6) Yet the fingerprints of identical twins are not identical. Some characteristics, such as pattern type and ridge count, are similar between twins.(7) However, the detailed “minutiae”—where skin ridges meet, end, or bifurcate—are different even between identical twins.

                      Подробнее можно почитать в «7. Reed T, Viken RJ, Rinehart SA. High heritability of fingertip arch patterns in twin-pairs. Am J Med Genet. 2006; 140A: 263–271.»

                      Следовательно, точный рисунок отпечатка пальца является частью фенотипа, но не генотипа. Редактированием генома вы можете изменить глобальный рисунок(там что-то типа 5 основных вариантов), но точный рисунок неподвластен.

                      Остается два вопроса: откуда берутся отпечатки пальцев и почему они не меняются в течении жизни, хотя клетки кожи обновляются?

                      Кожа состоит из трех слоев: эпидермис, дерма, и гиподерма(подкожная жировая клетчатка). Последняя нам мало интересна, а вот на первых двух стоит остановиться подробнее. Основные клетки верхнего слоя кожи, которые мы и видим в качестве отпечатка — корнеоциты, ороговевшие кератиноциты. Ороговевшая часть кожи обновляется каждые 10...30 дней. Но формирование отпечатков пальцев происходит глубже: в дерме. При развитии человеческого зародыша клетки дермы начинают делиться чуть больше, чем, скажем, у обезьян(у которых, за исключением коал, нет паппилярных узоров). Механические напряжения в ходе этого деления «выпячивают» часть ткани наружу, образуя гребни папиллярного узора — сосочки дермы. И этот же самый узор передается через весь эпидермис на поверхность кожи, слой за слоем повторяя рисунок поверхности дермы.
                      Таким образом, даже если срезать верхний слой эпидермиса(или весь эпидермис), рисунок не изменится — он находится глубже, в дерме, которая живет гораздо дольше, и обновляется гораздо медленнее, чем эпидермис. Ну, да, допустим 50% за 10 лет. 5% каждый год. Представьте себе дом, из которого каждый год убирают 5% кирпичей и заменяют их новыми точно такими же. Будет ли он через 10 лет сохранять ту же форму? Конечно будет, в чем проблема. Будет ли он тем самым кораблем, уже другой вопрос. Так что не так в сохранении рисунка(который гораздо крупнее отдельных клеток) неизменным при постепенной смене клеток?
                      А точная картинка отпечатка пальца берется, фактически, из теплового шума. Это случайная картинка сброса напряжений в точках роста, и представляет собой отличный пример фенотипа, независимого от генотипа.

                      К такому же выводу можно было прийти даже без гугления, просто некоторыми размышлениями. Есть ли эволюционный смысл хранить в ДНК текстуру всей кожи тела? Причем не просто хранить(там хранится куча мусора), а хранить бережно и без повреждений и содержать весь механизм трансляции днк в текстуру. Нет. Отпечатки пальцев — это всего лишь механизм, увеличивающий тактильную чувствительность пальцев, что пригождается для точных операций, и конкретный рисунок этих отпечатков не важен, главное, чтобы он был с изгибами. Поэтому его проще генерировать на месте при инициализации класса. Все.


                      1. vvzvlad
                        28.11.2017 20:07

                        Прошу извинить меня, ошибся. Незаслуженно оболгал обезьян: у них есть папиллярные узоры, правда, простые: в виде параллельных линий. Ну и коала как-то попала в обезьян, хотя она другого вида.


                      1. Kobalt_x
                        29.11.2017 02:11

                        извиняюсь что влезаю, я понял после глубоких порезов до дермы остается шрам и отпечаток меняется это ясно, при неглубоких всё восстанавливается и отпечатки те же. Но тогда получается что после ожогах 3-4 степени, когда доходит до повреждения дермы, отпечаткам хана, или можно дерму с других мест пересадить, но тогда вопрос что будет с узорами?, или я что-то капитально не понимаю?


                        1. vvzvlad
                          30.11.2017 08:34

                          Скорее всего, сформируется рубец, и отпечаток пальца изменится со временем.


                      1. alexkbs
                        30.11.2017 04:03

                        Вам бы комментарии собрать и дополнить иллюстрациями. Получилось бы отличная статья для публикации.


  1. Sergey_datex
    27.11.2017 21:51

    Проверил на своем Thinkpad X201 — тоже встроенный сканер (USB\Vid_147e&Pid_2016) отдает рисунок. Также есть предустановленная тестовая софтина, которая рисунок отпечатка визуализирует для проверки работоспособности сканера.
    Также глянул трафик с помощью Bus Hound — по объему данных очень похоже на RAW изображения, но по самим данным — либо шифровано, либо отличающийся формат, не заметил такой картинки как у автора. НО! этот сканер умеет будить ноут из спящего/ждущего режимов, а значит кто-то принимает решение о совпадающем отпечатке. Думаю, что режим отдачи отпечатка в виде картинки у него — опциональный.

    Скриншоты
    imageimage
    image


    1. vassabi
      27.11.2017 21:57

      попробуйте сравнить картинки без пальца, с пальцем, с половиной пальца (полсенсора заслонить целлофаном\бумагой) — тогда должно быть понятнее, что за формат (еще, картинка может быть не квадрат, а прямоугольник).


      1. Sergey_datex
        27.11.2017 22:03

        Там сканер, по которому нужно проводить пальцем. если проводить самым краем — он не отдает данные. Пробовал по-разному часть сенсора занимать — все равно данные рандомны. Думаю, шифрование. обратил внимание что данные от сканера идут пакетами по 1988 байт, каждый из них предваряется еще одним пакетом размером 64 байта, содержимое его рандомно. Возможно, это ключ шифрования для следующего пакета.

        вот оно
        image


        1. Sergey_datex
          27.11.2017 22:17

          Глянул схему ноутбука. Несмотря на то, что сканер подключен по USB — у него есть еще 4 сигнала, один из которых POA_WAKE — включает ноут.
          Проверил — включил в софте pre-power authentification — действительно — когда ноут выключен, сканер включен, и пока не проведешь записанным в него пальцем — ноут не включается.


    1. Konachan700 Автор
      27.11.2017 22:19
      +1

      Там линейный сенсор. Он отдает пакет восьмибитных картинок 16х128 или что-то такое. Полная картинка отпечатка в недрах софта сшивается уже. Потому ее куда сложнее получить из дампа.


    1. a1ien_n3t
      27.11.2017 23:29

      В новых Thinkpad(T460, t470 и т.д) все стало сложнее. Досихпор нету драйвера под Linux. И там сканер целый протокол безопсности содержит. Народ реверсит виндовый драйвер.
      github.com/nmikhailov/Validity90


    1. gban
      28.11.2017 09:51

      Ну вот, вы же свой отпечаток слили, сейчас вам заблюреное по этому срину то и дорисуют…


  1. geisha
    28.11.2017 02:12

    Вообще, несколько удивило то, что отпечатки приходят просто картинкой и обрабатываются в юзерспейсе. Безопасность? Нет, не слышали. На мой взгляд, отпечатки не должны покидать сканер, к системе должен вылетать некий хеш, уникальный для сканера, но никак не сырая картинка. Да, отпечатки публичны, но одно дело собирать их по одному в реальном мире, и совершенно другое — найти уязвимость в ПО и сливать готовые отпечатки миллионами…

    ИМХО лучше так чем какой-нибудь TPM под каким-нибудь Intel Management Engine. Open-source hardware — это утопия, пока что, а вот доступ к определенному USB порту можно и ограничить на уровне ядра (чисто гипотетически).


  1. cicatrix
    28.11.2017 11:47

    Тут хочу спросить, а разве выдача хеша со сканера хоть сколько-нибудь безопаснее выдачи картинки?

    По-моему, нет. Во-первых, хэш гораздо проще подделать, затем прикинуться сканером и отдать его проверяющей системе, во-вторых, софт, опознающий картинку, можно допилить, добавив контрольных точек каких-нибудь и дополнительные проверочные алгоритмы, а сканер «допилить» гораздо сложнее. Кроме того, софт можно использовать на разных сканерах, работающих по сходному типу, не привязываясь к той или иной модели сканера. Ну а сканер на то и сканер, чтобы картинки отдавать.


    1. vassabi
      28.11.2017 12:04

      хеш можно скопировать — но правильный хеш этого устройства на другом устройстве ничего не даст.
      А отсканированный хотя бы один раз отпечаток — можно распечатать и далее везде.
      Дело не в том, чтобы сканер не сканировал, дело в том, чтобы до отпечатка хотя бы не было так просто добраться.


      1. cicatrix
        28.11.2017 12:20

        хеш можно скопировать — но правильный хеш этого устройства на другом устройстве ничего не даст.

        То есть, получается, для каждой модели сканера нужно разрабатывать свой софт?
        А насчёт «скопировать отпечаток» — какая-то сюрреалистическая модель угроз. Да, если картинка лежит в открытом незашифрованном виде в памяти, это хреновая архитектура, но когда к памяти вашего устройства у злоумышленника уже есть доступ, то какой смысл ему вообще подделывать ваши отпечатки, он и так уже «внутри»?
        Да. И «картинку» можно получить, просто дав вам подержать в руках что-нибудь, а потом уже изготовить копию вашего отпечатка. В Mythbusters был эпизод на эту тему.

        P. S. В крайнем случае, отпечаток вашего пальца можно получить и терморектально.


        1. Konachan700 Автор
          28.11.2017 12:58

          И потом такой хакер будет ходить в каждый дом с паяльником и набором судебного эксперта…
          Проблема картинки в том, что если найдут уязвимость и массово угонят отпечатки, они навсегда осядут в базах хакеров. Базы паролей и хешей уже продают как сервис, несмотря на то, что пароли легко меняемы. Отпечатки сменить нельзя, базы будут вечными. База отпечатков с полями imei, фио и прочего — сразу очень вкусный «черный» сервис: «Вы украли заблокированный айфон? Поможем разблокировать всего за 1.99XMR».
          Это примерно та же фигня, как пин-пад на банкомате, в котором ввод хешируется. Тоже можно сказать, что если хакер добрался до потрохов оного банкомата, он и так деньги заберет, зачем там хеш… Зато если хакер найдет дыру в ПО банкомата, то собрать пин-коды массово он не сможет. И даже взломав один банкомат удаленно, он снова не сможет собрать пин-коды.


  1. ildarz
    28.11.2017 11:59

    Вообще, несколько удивило то, что отпечатки приходят просто картинкой и обрабатываются в юзерспейсе. Безопасность? Нет, не слышали. На мой взгляд, отпечатки не должны покидать сканер, к системе должен вылетать некий хеш, уникальный для сканера, но никак не сырая картинка.

    1. А то, что клавиатурный ввод приходит нешифрованным, вас не смущает в том же аспекте безопасности? :)


    2. Представьте себе, что сканер будет выдавать хэши. Учитывая, что вы при сканировании никогда не получите два одинаковых отпечатка одного и того же пальца, как вы дальше на основании этих хэшей аутентификацию проводить будете? Там не хэши нужны, а обратимое шифрование, со всеми сопутствующими вопросами с генерацией, хранением и передачей ключей (может быть, часть проблем снимется, если гомоморфное шифрование использовать), разработкой единых стандартов, и т.п. Так что удивляться особо не стоит, не такая уж это простая задача.


    1. vassabi
      28.11.2017 12:09

      1) Пароль я могу сменить. Пароли у меня на разных устройствах разные. Пароли могут быть даже одноразовыми.
      2) Хеш не от сырого скана, а от его инварианта и ID устройства.


      1. cicatrix
        28.11.2017 12:25

        Хеш не от сырого скана, а от его инварианта и ID устройства

        А как это «инвариант» отпечатка пальцев?


        1. mayorovp
          28.11.2017 13:36

          Координаты найденных особых точек, например. По ним все еще можно восстановить картинку — но для этого понадобится специалист работавший с биометрией а не простой принтер.


          1. cicatrix
            28.11.2017 13:42

            Не думаю, что в отпечатках пальцев вообще всех людей есть общие для всех признаки. Либо эти признаки настолько общие, что уникальности не обеспечивают.
            Наверняка есть группы, подгруппы, виды и пр. И есть индивиды, узор которых вообще не укладывается ни в одну классификацию, так что сомневаюсь, что по скану отпечатка можно выделить подобный инвариант.


            1. mayorovp
              28.11.2017 13:56

              Ну, я когда-то работал над биометрической СКУД для школ. Там при регистрации отпечатка в системе именно что запоминались характеристики отпечатка, и в базе картинки не хранились в принципе. Но по сети передавались именно картинки, потому что у сканера попросту не хватало ресурсов для обработки.


              Однако особые люди и правда существуют. Только у них не какие-то "особые" отпечатки, а (частичное) отсутствие оных. Проблемы возникают из-за мозолей, шрамов или кожных болезней.


      1. ildarz
        28.11.2017 13:06

        1. Если у вас на компе стоит нечто, в злонамеренных целях спокойно читающее данные, идущие от клавиатуры и вообще любых других USB-устройств, создателей которых в большинстве своем не сильно заботит шифрование, то сильно ли вам легче от того, что вы можете пароли поменять? :)
        2. И это будет уже не просто сканер, а полноценное криптографическое устройство типа смарт-карты. Что вкупе с удорожанием разработки и производства вызывает многочисленный ряд вопросов и проблем (первый из которых — а сильно ли оно вообще надо с учетом того, что отпечатки пальцев, в отличие от паролей или приватных ключей, ни разу не являются информацией, к которой можно разумными способами исключить доступ посторонних, второй — это исключает возможность аутентификации в одной и той же системе с разных устройств, и т.д., и т.п.). Речь-то не о том, что так нельзя сделать, а о том, что все не так просто, как кажется автору.


        1. Konachan700 Автор
          28.11.2017 13:30
          +1

          2. Проблема не в доступе посторонних. Отпечатки по своей сути публичны. Проблема в возможности их массового сбора в связке с метаданными. Когда у хакера сотня отпечатков, это бесполезный мусор в большинстве случаев — никуда не прикрутишь. Когда у него отпечатков сотня миллионов, это уже очень дорогая база, интересная в равной степени как спецслужбам, так и криминалу.
          Уязвимости в софте никто не отменял, и хранение-передача биометрии в равках — уже само по себе дыра в безопасности.


          1. ildarz
            28.11.2017 14:43

            Еще раз — вы удивляетесь, что есть некая проблема, не дав себе труд как следует подумать о возможных решениях и их практической применимости. Я вовсе не утверждаю, что свободно перехватываемые raw-данные биометрии — это хорошо, а просто показываю, что удивляться тут совершенно нечему, ибо альтернативные реализации несколько сложнее и ограниченнее, чем вам кажется.


            1. izzholtik
              28.11.2017 16:01

              Потрудитесь почитать, как работает сканер на нексусах/пикселях/айфонах. Решение проблемы тривиально: сохранять отпечаток в несчитываемой памяти сканера и отдавать наружу только результат и, упрощённо говоря, пароль разблокировки. Но это стоит денег, и потому почти все производители на безопасность забивают.


              1. ildarz
                28.11.2017 16:52

                Я вроде бы совершенно не оспариваю ни тот факт, что подобные решения существуют в природе, ни тот факт, что для произвольного комментатора с гиктаймса тривиально распространить их на всю индустрию и произвольные сценарии работы с биометрией. Так что даже не знаю, что и зачем вы хотели сказать. :)


              1. Kobalt_x
                28.11.2017 18:33

                Вроде на Айфоне сканер привязан к матери и новый сканер не воткнешь. Что на pc/ноутах реализовать можно только через очередной whitelist по серийнику в uefi что мало того что доставит неудобства так и скорее всего будет защищать максимум до первого обновления uefi


      1. l0ser140
        28.11.2017 13:54

        2) недавно на хабре был обзор какого-то модуля сканера отпечатков. Так отпечатки хранились прямо в модуле и наружу модуль лишь передавал совпадает ли отпечаток с имеющимся в базе или нет.


  1. nonpar
    28.11.2017 12:59

    Все эти технологии биоидентификации не только уязвимы, но и сомнительны с правовой точки зрения. Личность (субъект права) — это не палец и не сетчатка глаза. И палец, и целая рука, и глаз могут быть субъектом утрачены. И как тогда быть с его данными, если их защищать, идентифицируя по особенностям строения этих органов? Поэтому серьёзные институты (в отличие от умников из Сбера) весьма осторожны в соответствующих прогнозах. Лучше уж какой-нибудь электронный (причем желательно — контактный) носитель в качестве ключа доступа. Его можно потерять; но ведь деньги и документы тоже можно потерять, и люди с этим как-то жили столетиями)


    1. vvzvlad
      28.11.2017 19:18

      Самая большая проблема диванных теоретиков, это то, что вы путаете аутентификацию личности и авторизацию при разблокировке телефона/компьютера.
      Вы идеалисты, которые хотят «все или ничего» — механизм, достаточно крутой, чтобы он позволил идеально аутентифицировать личность, и достаточно простой и дешевый, чтобы его можно было запихнуть в любой телефон, так, чтобы не страдал пользовательский опыт.
      Это достаточно трудно, потому что личность надежно определяется только уникальной информаций, хранящейся в мозгу, и тут сразу же возникают проблемы: как поддерживать уникальность этой информации, и как ее вводить для определения личности. Мы можем сделать очень длинный хитрый пароль, но пользователь заколебется вводить его каждый раз, когда берет в руки телефон. Мы можем использовать смарт-карту, но ее можно будет либо оставить внутри телефона, либо заколебаться вставлять ее каждый раз. К тому же, ее тоже по-хорошему, надо защищать паролем.
      Если взять что-нибудь проще, типа отпечатка пальца/радужки/скана лица, можно получить более-менее достаточную надежность и решить большинство проблем. «Но нет!» — скажут диванные теоретики, «ВЕДЬ ЕГО ЖЕ МОЖНО ВЗЛОМАТЬ». «МЫ ЛУЧШЕ БУДЕМ ВВОДИТЬ ПАРОЛИ ПО 20 СИМВОЛОВ, ЧЕМ ПОЛЬЗОВАТЬСЯ НЕНАДЕЖНОЙ СИСТЕМОЙ, И ВСЕХ ЗАСТАВИМ ЭТО ДЕЛАТЬ».
      Как будто не понимают, что если всех заставить вводить пароли по 20 символов, они будут состоять из одной буквы. Просто потому, что среднему пользователю насрать на вашу безопасность, ему важнее удобство.

      А на самом деле, когда пользователь берет в руки телефон, ему не надо подтверждать свою личность(аутентифицироваться). Ему надо просто авторизоваться на телефоне: защитить его от случайного чувака, чтобы тот не посмотрел фоточки голой девушки этого пользователя, да в менеджер паролей не залез. И вот с этой точки зрения шифрование+отпечаток пальца прекрасно защищают пользователя с достаточной надежностью.
      Телефон обычного человека — это такой неуловимый Джо. Он нафиг никому не нужен для прицельной атаки. Если попался случайно, да, можно и пошариться. Но воришка, украв ваш телефон, или человек, нашедший потерянный телефон, не станет охотиться за сканом лице или отпечатком пальца. Не получив доступ к данным, он сбросит телефон и продаст его на запчасти.
      А если у кого-то есть достаточные причины и возможности для прицельной атаки именно на ваш телефон, то увы, ничего вас не спасет. Пароль смотрится камерой, смарт-карта крадется, отпечатки пальцев снимаются со стакана, 3Д-фотография лица делается камерой, скрытой за зеркалом.


      1. nonpar
        28.11.2017 20:56

        Много букв в пустоту. Я писал вовсе не про частный случай разблокировки компа/телефона, а про биоидентификацию личности, которую, помнится, г-н Греф обещал тотально использовать вместо банковских карт чуть ли не уже завтра)