Kaspersky analüüs Equation Grupi Rc6 on vale

Original: https://www.cs.uic.edu/~s/musings/equation-group-rc6/


20. august 2016 • Stephen Checkoway

Kaspersky Lab hiljuti avaldatud blogi postitus Harv rakendamise RC5 / Rc6 in “ShadowBrokers” prügila ühendab neid võrrandisse pahavara, kus nad analüüsivad RC6 plokkšifrist rakendamiseks kasutatakse viimastel ShadowBrokers vabastada ning võrrelda seda varasemate Equation Group pahavara nad leidsid. Nad järeldavad, et kuna kõik rakendused Nad analüüsisid sisaldavad Rc6 pidev oma olematuks vormis, see peab olema pärit samast autorid kuna see on nii ebatavaline. Nende analüüs on vale.

Ma ei taha, et nende järeldus on vale. Nad ilmselt õigus. See on ilmselt sama koodi. Aga nende analüüs on kindlasti vale.

Uuenda: ma ei ole esimene, kes seda märgata.

Kaspersky peamine nõue on, et kuna mõned platvormid (kuigi nad ei ütle, mis, ja see ei ole tõsi peaaegu kõike uuem kui Z80), lisaks on kiirem kui lahutamine ning seetõttu lähtekoodi Rc6 peaks sisaldama lisaks konkreetse pidev, q32, võtmes laienemine rutiinne. Mida nad leidsid nii ShadowBrokers prügimäele ja varasema Equation Group pahavara oli Rc6 rakendamine, mis oli lahutades -Q32 lisamise asemel q32. Kaspersky, see on suitsetamise relv ühendab kaks.

Mõtle tüüpiline rakendamise Rc6. (Tüüpiline, tähendab, ma guugeldatud eest Rc6 lähtekoodi ja valitud esimene rakendamise märkasin, et olin ilmselt standalone.) On read 78-80, näeme silmus võti laienemine kood, mis Kaspersky keskendub, reprodutseerida siin.

for(i=1; i<2*rounds+4; ++i){
	s->S[i] = s->S[i-1] + Q32;
}

 

Q32 on konstantne küsimus ja see on defineeritud line 37 nagu 0x9E3779B9, mis on toodud tüüpvormi, mis ilmub Ron Rivest algne paber.

Juba väga kiire analüüsi ShadowBrokers binaarpaketist see on selge, et paljud neist programmidest koostati kasutades Red Hat versioon GCC 3.4.x või GCC 4.0.0. Mõnevõrra veidralt, samas binaarne lisab objektid mitu koostajad. Näiteks BANANAGLEE/BG2100/Install/LP/bg_redirector-2140, mida ma varem uurinud, tundub sisaldada esemeid koostatud kasutades nelja erinevat versiooni GCC.

loc_117BC:
                LDR             R2, [R1]
                LDR             R3, =0x9E3779B9
                ADD             R0, R0, #1
                CMP             R0, #0x2C ; ','
                ADD             R3, R2, R3
                STR             R3, [R1,#4]!
                BNE             loc_117BC
                MOV             R4, #0

 

Tuginedes kuupäevade ja GCC versiooni, ma installitud CentOS 4.1 (mis põhineb Red Hat) VM. Ma alla Rc6 rakendamine on seotud eespool ja koostati see GCC 3.4.3 20050227 (Red Hat 3.4.3-22.1), mis tuli koos OS. See ei ole päris sama versiooni GCC, aga see on piisavalt lähedal. Vaadates kas koost toodetud GCC või töötab objdump objekti fail, näeme lahutamist 0x61C88647 asemel lisamine 0x9E3779B9. Ja see kehtib kõigi optimeerimise taset (-O0 läbi -O3 ja -os).


Kuna tõlkija vastutab ise tootma lahutamine juhendamine, selle olemasolu ei veenvalt tõendada, et võrrand Group pahavara ja kood vabaneva ShadowBrokers kirjutas samasse rühma.

Uuenda 2: Rohkem tõendeid, et Kaspersky on vale nende analüüs pärineb vaadates mõned teised arhitektuuri. Näiteks MIPS versioon SecondDate, pidev 0x9E3779B9 kasutatakse koos Addu (märkus väärtus salvestatakse $ a1).

 

Rc6_expandKey:
                lui     $v0, 0xB7E1      # Load Upper Immediate
                move    $t6, $a1
                li      $v0, 0xB7E15163  # Load Immediate
                lui     $a1, 0x9E37      # Load Upper Immediate
                move    $a3, $a0
                addiu   $sp, -0x10       # Add Immediate Unsigned
                sw      $v0, 0($t6)      # Store Word
                li      $t5, 1           # Load Immediate
                li      $a1, 0x9E3779B9  # Load Immediate
                addiu   $a0, $t6, 4      # Add Immediate Unsigned

loc_9B98:                                # CODE XREF: Rc6_expandKey+3Cj
                lw      $v0, -4($a0)     # Load Word
                addiu   $t5, 1           # Add Immediate Unsigned
                sltiu   $v1, $t5, 0x2C   # Set on Less Than Immediate Unsigned
                addu    $v0, $a1         # Add Unsigned
                sw      $v0, 0($a0)      # Store Word
                bnez    $v1, loc_9B98    # Branch on Not Zero
                addiu   $a0, 4           # Add Immediate Unsigned

 

PPC versioon SecondDate, 0x9E3779B9 kasutatakse addis / Addi.

 

loc_98AC:
                slwi      r7, r6, 2     # Shift Left Immediate
                addi      r6, r6, 1     # Add Immediate
                add       r9, r7, r4    # Add
                lwz       r10, -4(r9)   # Load Word and Zero
                addis     r8, r10, 0x9E37 # Add Immediate Shifted
                addi      r0, r8, 0x79B9 # Add Immediate
                stwx      r0, r7, r4    # Store Word Indexed
                bdnz      loc_98AC      # CTR--; branch if CTR non-zero

 

Aastal ARM versioon BSecondDateCommon, 0x9E3779B9 kasutatakse lisamisel.

 

loc_117BC:
                LDR             R2, [R1]
                LDR             R3, =0x9E3779B9
                ADD             R0, R0, #1
                CMP             R0, #0x2C ; ','
                ADD             R3, R2, R3
                STR             R3, [R1,#4]!
                BNE             loc_117BC
                MOV             R4, #0

 

X86, mingil põhjusel, GCC otsustab minna koos lahutamine. Teistel arhitektuur, see ei ole.

Leave a Reply