ABIS Infor - 2014-03

Verborgen data op uw bestandssysteem?

Peter Vanroose (ABIS) - 20 september 2013

Samenvatting

Het verhaal gaat dat je verborgen boodschappen kan horen als je muziek van o.a. The Beatles of Led Zeppelin achterwaarts afspeelt. Zo zijn er ook geruchten dat er informatie kan verborgen zitten in je bestanden. Of zijn dit maar fabeltjes?

Situering

Elk bestandssysteem koppelt aan een bestand - behalve z'n inhoud - ook bijkomende informatie, metadata, zoals b.v. de laatste wijzigingsdatum en de eigenaar. Het bestandssysteem HFS van de Apple MAC (en ook z'n voorloper, MFS) gaat daarin nog een stuk verder. Het voorzag al sinds midden de jaren 1980 (als enige) de mogelijkheid om willekeurige stukken metadata (van willekeurige lengte) aan een bestand te koppelen. Dergelijke fragmenten metadata worden resource forks of "alternatieve datastromen" genoemd, naast de "gewone" bestandsdata die de data fork genoemd wordt. Een typische toepassing van een resource fork is het grafisch icoontje (kleine bitmap) dat moet getoond worden bij een bestand.

Bij de introductie van het Windows NTFS bestandssysteem (met Windows NT 3.1 in 1993) werd meteen ook de ondersteuning van dergelijke "Alternate Data Streams" (ADS) opgenomen, waarschijnlijk om het migreren van HFS naar NTFS (en dus het overstappen van Apple naar Microsoft) te vergemakkelijken.

NTFS en ADS

Het standaard bestandssysteem voor MS-Windows, NTFS, laat toe om aan elk bestand één of meerdere datastromen te koppelen. Een eerste datastroom bevat de "Access Control List" (ACL, beveiligingsinformatie zeg maar); alle bestanden (behalve lege bestanden en snelkoppelingen) hebben uiteraard ook een "inhoud"-datastroom, de "data fork" dus. Een snelkoppeling heeft bovendien een link-datastroom (waarin een bestandsnaam staat). Maar daarnaast laat NTFS ook nog toe om een willekeurig aantal Alternate Data Streams (ADS) aan een bestand te koppelen, met willekeurige inhoud.

Om een ADS te specificeren moet z'n naam gescheiden door een dubbelpunt aan de naam van het bestand toegevoegd worden. Om bij voorbeeld de ADS genaamd "extra" bij het bestand C:\test.txt aan te geven, moet dus de naam C:\test.txt:extra gebruikt worden. Klaar en duidelijk dus. Alleen... deze notatie voor de inhoud van een ADS wordt door omzeggens geen enkele Windows-applicatie ondersteund! Een ADS van een bestand is dus totaal onzichtbaar, zowel in de Windows Verkenner als met het DIR-commando. Wat de Alternate Data Streams de facto onbruikbaar maakt. Of toch niet?

Gebruik van ADS

Sinds Windows Vista laat de nieuwe optie "/R" van DIR (commandolijn-instructie) ook de ADS in een folder zien. Concreet zou de output van de instructie "DIR /R test.txt" er dus b.v. als volgt kunnen uit zien:

2014-02-26  17:48               600 test.txt
                                700 test.txt:extra:$DATA
               1 File(s)            600 bytes

Er verschijnt dus een extra lijn (t.o.v. "DIR" zonder "/R"), maar het totaal zegt nog altijd "1 File, 600 bytes" (dus de grootte van de "gewone" datastroom); net zoals de Verkenner zou tonen, trouwens. De extra 700 bytes zijn dus effectief verborgen! (Bemerk ook de extra ":$DATA"; die wordt door DIR/R altijd getoond, maar is verder niet relevant.)

Die 700 bytes nemen wel degelijk plaats in op de harde schijf, maar als we ze niet kunnen bekijken, aanmaken, aanpassen of wissen zijn ze natuurlijk nutteloos. Welnu, er is maar één manier om dit te doen op een "standaard" Windows-systeem, d.w.z., zonder extra software te moeten installeren, en hiervoor is, net zoals voor DIR, de commandolijn nodig. Dus eerst een kort intermezzo over deze niet-grafische interface van Windows, ook wel de "DOS box" genoemd.

cmd.exe en datastromen ombuigen

Wanneer je in Windows de applicatie cmd.exe opstart, opent er een zwart venster met een C:\xxx> prompt (waarbij "xxx" door de naam van de actieve folder zal vervangen zijn). Typ na deze prompt een instructie (b.v. "DIR /R") gevolgd door de ENTER-toets, en het resultaat van het commando verschijnt op hetzelfde zwarte scherm.

Typ nu hetzelfde commando, maar vóór je ENTER drukt, voeg je de volgende tekst toe (zonder de aanhalingstekens): " > test.txt" . Het resultaat van het commando verschijnt nu niet meer op het scherm, maar is "omgebogen" naar het bestand test.txt, dat hierdoor hetzij nieuw aangemaakt werd, hetzij overschreven werd. Omgekeerd zijn er instructies van cmd.exe die data willen lezen i.p.v. naar het scherm te schrijven. Een mooi voorbeeld hiervan is de instructie "more": om de inhoud van een bestand te bekijken (op het scherm) heeft "more" een datastroom nodig, een bestands-inhoud dus. Om de inhoud van "test.txt" te bekijken, kun je de volgende instructie gebruiken: "more < test.txt". De "<" notatie buigt dus de invoerstroom om naar een instructie vanuit een bestand, terwijl ">" de uitvoerstroom ombuigt naar een (nieuw) bestand. Instructies die zowel lezen als schrijven, kunnen uiteraard met zowel ">" als "<" gebruikt worden.

Wat blijkt nu? Alleen binnen cmd.exe, en alleen na een "<" of een ">" wordt de ":"-notatie van ADS begrepen. (Er zijn andere instructies die de ADS-notatie snappen, zoals b.v. Notepad, maar enkel wanneer opgestart binnen cmd.exe)

ADS-manipulaties samengevat

1. Hoe maak ik een nieuwe ADS genaamd extra aan bij het bestand test.txt?

		more < bestand.txt > test.txt:extra

Dit kopieert dus de inhoud van bestand.txt naar de ADS genaamd extra van test.txt (en overschrijft daarbij eventueel de oude inhoud). Merk op dat het bestand test.txt hiervoor niet hoeft te bestaan; daarna lijkt er gewoon een leeg bestand test.txt te zijn gemaakt (bestandsgrootte 0 bytes), maar eigenlijk klopt dat niet want er is geen data fork, alleen een ADS!

2. Hoe bekijk ik de inhoud van de ADS genaamd extra bij het bestand test.txt?

		more < test.txt:extra

3. Hoe wis ik de ADS genaamd extra van test.txt?

Het eenvoudigste wat je kunt doen, is z'n inhoud "leeg" maken. Maak hiervoor eerst een leeg bestand aan, b.v. met behulp van de instructie "copy NUL: leeg.txt", en dan dus

		more < leeg.txt > test.txt:extra

Of nog beter: hernoem eerst test.txt naar test2.txt m.b.v. "rename test.txt test2.txt". Dit "nieuwe" bestand test2.txt is niet echt nieuw: het is het oude bestand, waarvan alleen de naam-metadata gewijzigd is. Er is dus nog steeds een ADS, maar die heet nu "test2.txt:extra". Kopieer vervolgens de inhoud van test2.txt naar test.txt met "copy test2.txt test.txt". De copy-instructie ondersteunt geen ADS, zodat er geen test.txt:extra aangemaakt werd. Alleen de "hoofd"-datastroom van het bestand is dus gekopieerd. Verwijder ten slotte test2.txt: "del test2.txt".

Tot slot nog vermelden dat ook folders (zoals b.v. C:\Windows) één of meerdere ADS kunnen hebben. Een dergelijke ADS valt echter zeer moeilijk nog te verwijderen, als het over een systeem-folder gaat ...

Besluit

De zogenaamde "Alternate Data Streams" (ADS) van NTFS zijn een goed bewaard Windows-geheim dat u toelaat om gegevens op uw harde schijf op te slaan zonder dat iemand ooit hun bestaan (en dus hun inhoud) te weten komt. Anderzijds ondersteunt geen enkele "gewone" Windows-applicatie deze bestandsparasieten, dus let op bij b.v. het kopiëren, verslepen, zippen, comprimeren, converteren, ... van een bestand waaraan een waardevolle ADS hangt!

Referenties:

  1. http://www.alletop10lijstjes.nl/verborgen-boodschappen-in-muziek/
  2. http://en.wikipedia.org/wiki/Hierarchical_File_System
  3. http://en.wikipedia.org/wiki/Alternate_Data_Streams