Tehnički članak

Otkrijte izmenjen XLSX: HotXLS Agile dataIntegrity HMAC

HotXLS upisuje usaglašen blok dataIntegrity u Agile-šifrovane XLSX pakete i proverava ga pri otvaranju. HMAC-SHA-512 pokriva kompletan EncryptedPackage stream, uključujući njegov osmobajtni StreamSize prefiks, i proverava se nad šifratom pre nego što se dešifruje ijedan segment, tako da se pogrešna lozinka ili izmenjen paket otkrivaju umesto da se dešifruju u besmislicu

Enkripcija bez integriteta je poluodgovor, a formati Office fajlova čine tu prazninu lako previdljivom, jer enkripcija spolja deluje veoma temeljno. Razumevanje šta svaki sloj obećava je ono što bezbednosnu reviziju čini kratkom

Šta zapravo obećava šifrovana radna sveska?

Agile enkripcija, definisana u [MS-OFFCRYPTO], daje vam poverljivost kroz AES u CBC režimu sa ključem izvedenim iz iterativnog SHA-512 heša lozinke. Poverljivost je čitavo obećanje te konstrukcije. CBC nije autentifikovani režim: ne kaže ništa o tome da li je šifrat koji dešifrujete zaista onaj šifrat koji je upisan

Praktična posledica je konkretna. Izmenite bitove u šifrovanom paketu i CBC će ih rado dešifrovati u drugačiji čist tekst. Obično ćete dobiti grešku parsiranja ZIP-a negde nizvodno, jer oštećen deflate tok retko preživi, ali reč „obično” u toj rečenici nosi veliki teret, a greška parsera nizvodno je užasno mesto da saznate da je fajl izmenjen. Element dataIntegrity postoji da bi direktno odgovorio na to pitanje, pre dešifrovanja, pomoću MAC-a nad tačnim bajtovima

Kako provera radi, i kojim redosledom

Redosled je zanimljiv deo. HotXLS izvodi međuključ iz lozinke, dešifruje šifrovani HMAC ključ i HMAC vrednost iz atributa dataIntegrity koristeći IV-ove izvedene iz blok ključa, izračunava HMAC-SHA-512 nad šifrovanim paketom onako kako je uskladišten, i poredi. Tek tada počinje dešifrovanje segmenata

Provera MAC-a nad šifratom, a ne nad čistim tekstom, standardna je disciplina encrypt-then-MAC, i upravo to čini proveru smislenom: izmenjen paket se odbija bez ijednog bajta pod kontrolom napadača koji je prošao kroz putanju dešifrovanja i dekompresije. Oba poređenja u putanji otvaranja, heš verifikatora lozinke i HMAC vrednost, akumuliraju razlike pomoću XOR i OR kroz čitav digest umesto da se prekinu rano na prvom neusklađenom bajtu, tako da nijedno ne otkriva poziciju bajta kroz vreme izvršavanja

var
  Book: TXLSXWorkbook;
begin
  Book := TXLSXWorkbook.Create;
  try
    // Radi za obične, Standard-šifrovane i Agile-šifrovane fajlove
    if Book.OpenEncrypted('incoming.xlsx', PasswordFromVault) = 1 then
      ProcessWorkbook(Book)
    else
      // Pogrešna lozinka, ili paket čiji se dataIntegrity HMAC nije poklopio
      Quarantine('incoming.xlsx');
  except
    on E: Exception do
      Quarantine('incoming.xlsx: ' + E.Message);
  end;
  Book.Free;
end;

Na strani pisanja ništa se ne menja u vašem kodu. SaveAsEncrypted automatski emituje blok, a soli, ulaz verifikatora i HMAC ključ dolaze iz CryptGenRandom. Ako taj poziv ne uspe, HotXLS izaziva izuzetak umesto da se vrati na slabiji izvor. Fail-closed CSPRNG nije paranoja; tiho degradiranje na predvidiv izvor slučajnosti proizvodi fajlove koji izgledaju šifrovano, prolaze svaki funkcionalni test, a bezvredni su

Zašto se fajlovi bez tog bloka i dalje otvaraju?

Zato što je veliki broj Agile-šifrovanih radnih svezaka u opticaju napisan od strane proizvođača koji u potpunosti izostavljaju dataIntegrity, a njihovo odbijanje pokvarilo bi mnogo više legitimnog posla nego što bi zaštitilo. HotXLS tretira integritet kao prisutan samo kada su oba atributa, šifrovani HMAC ključ i šifrovana HMAC vrednost, prisutna i pravilno formirana. U suprotnom, verifikacija se preskače, a fajl se otvara kao i ranije

Ovo je odluka o kompatibilnosti sa bezbednosnom posledicom koju biste trebalo eksplicitno da imenujete u sopstvenom modelu pretnji: odsustvo bloka ne može se razlikovati od toga da ga je napadač uklonio, jer su atributi van MAC-a koji bi ih inače nosio. Ako kontrolišete oba kraja pipeline-a, tretirajte nedostajući blok kao otkaz politike na nivou aplikacije. Ako prihvatate fajlove iz spoljašnjeg sveta, tretirajte proveru onakvom kakva jeste, vredan signal kada je prisutna, a nikakav signal kada nije

Lozinka za izmenu je konvencija, a ne granica

Klasične XLS radne sveske podržavaju odvojen mehanizam koji se redovno meša sa enkripcijom: rezervaciju pisanja, Excel-ov prompt „lozinka za izmenu”. HotXLS je izlaže kroz SetModifyPassword, koja prima lozinku, zastavicu za preporuku samo-za-čitanje i ime rezervišućeg korisnika, i prijavljuje stanje kroz IsWriteReserved. Prosleđivanje prazne lozinke briše rezervaciju

Ono što se upisuje jeste par zapisa WRITEPROT i FILESHARING koji nose zastavicu za preporuku samo-za-čitanje, zastareo 16-bitni heš lozinke i ime korisnika kao BIFF8 Unicode nisku. Taj 16-bitni heš je kontrolna suma, a ne kriptografski digest, i sadržaj dokumenta uopšte nije šifrovan. Svako ko otvori fajl bilo kojim drugim alatom čita sve. Prava svrha ove funkcije je koordinacija: ona sledećoj osobi govori da neko smatra da je ovaj fajl njegov za uređivanje, u istoj kategoriji kao i kontrole na nivou lista pokrivene u XLSX zaštiti lista i opcijama dozvola

var
  Book: IXLSWorkbook;   // brojano interfejsom: ne pozivati Free
begin
  Book := TXLSWorkbook.Create;
  if Book.Open('shared-model.xls') = 1 then
  begin
    // Preporuka samo-za-čitanje, rezervisao servis za izveštavanje
    Book.SetModifyPassword('edit-me', True, 'Reporting Service');

    if Book.IsWriteReserved then
      Book.SaveAs('shared-model.xls', xlExcel97);
  end;
end;

Koristite oba sloja za ono u čemu su dobri. Stvarna poverljivost dolazi iz SaveAsEncrypted sa lozinkom koju niko van publike ne poseduje, što proizvodi AES-256 izlaz opisan u AES-zaštićenom XLSX izlazu. Rezervacija pisanja se dodaje na vrh kada je radna sveska artefakt zajedničkog uređivanja i kada želite da Excel pita pre nego što neko snimi preko nje

Šta proveriti na putanji nepouzdanog prijema

Provera integriteta štiti šifrovan sadržaj, a ne kontejner oko njega. XLSX fajl je ZIP arhiva, a struktura arhive se parsira pre nego što se izvrši bilo kakva logika enkripcije, pa validacija na nivou kontejnera pripada na prvo mesto u lancu; konkretni modovi otkaza pokriveni su u validaciji ZIP end-of-central-directory za nepouzdan XLSX. Posle toga, tretirajte otkaz integriteta i pogrešnu lozinku kao isti operativni događaj, jer su sa vaše strane po dizajnu nerazlučivi, a oba znače da se fajlu ne može verovati da je ono što pošiljalac misli da jeste

Beležite koji su fajlovi uopšte nosili blok dataIntegrity. Kroz nekoliko hiljada dokumenata ta statistika vam govori nešto korisno o alatima vaših pošiljalaca, i pretvara proveru po fajlu u posmatranje na nivou celog voznog parka na osnovu koga možete delovati

HotXLS čita i piše XLS, XLSX i ODS iz Delphi-ja i C++Builder-a bez instaliranog Excel-a, implementirajući Standard i Agile putanje enkripcije iz [MS-OFFCRYPTO] u Pascal-u. API-ji za enkripciju, zaštitu i radnu svesku dokumentovani su na stranici HotXLS Delphi komponente za tabele