Alexander (HH): Wie sicher ist die Keydatei? (LUKS)

Beitrag lesen

Moin Moin!

Hallo Alexander,

... Die Kopplung an die MAC-Adresse würde so schon auffallen.

die sollte natürlich nicht direkt abgefragt werden, sondern über eine "komplizierte Berechnung".

Das geht nicht.

Nehmen wir mal an, Du wärest richtig fies und würdest den relevanten Programmcode mit der besten zur Verfügung stehenden Verschlüsselung verschlüsseln. Zum Entschlüsseln gibt es eine Funktion int decrypt_and_run(void * key, char * key_password, void * encrypted_code, void * code_arguments), wobei key ein Passwort-geschützter Schlüssel aus einer Datei oder einer eincompilierten Konstante ist. Um aus der MAC-Adresse das Passwort für den Schlüssel zu erzeugen, gibt es eine Funktion int generate_password(char * password, size_t password_size, struct sockaddr mac_addr, void * license_key), die zusammen mit einem Lizenzkey (oder wie auch immer man das nennen möchte) ein Passwort für die Freigabe des Schlüssels erzeugt.

Das führt letztlich in etwa zu folgendem Code:


struct ifreq ifr;
char password[PWSIZE];
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
// ...
ioctl(sock, SIOCGIFHWADDR, &ifr);
generate_password(password,sizeof(password),ifr.ifr_hwaddr.sa_data,license_key);
decrypt_and_run(key,password,codeblock,argpointer);

Der Aufruf ioctl(sock, SIOCGIFHWADDR, &ifr) liest die MAC-Adresse über den Kernel aus der Hardware aus, und zwar IMMER in einem Stück. Das kannst Du nicht verhindern oder anders machen. Wenn Du externe Tools wie ifconfig aufrufst, endet das auch in exakt diesem ioctl.

Und im "echten Leben" sieht das so aus:

get-mac-address ist der Code von stackoverflow, ergänzt um ein paar printf-Statements.

[code]> strace -o /tmp/trace get-mac-addresses Found interface lo: MAC Address is 00:00:00:00:00:00 Found interface eth0: MAC Address is 38:EA:A7:A1:0F:2A Found interface vboxnet0: MAC Address is 0A:00:27:00:00:00

grep SIOCGIFHWADDR /tmp/trace

ioctl(3, SIOCGIFHWADDR, {ifr_name="lo", ifr_hwaddr=00:00:00:00:00:00}) = 0 ioctl(3, SIOCGIFHWADDR, {ifr_name="eth0", ifr_hwaddr=38:ea:a7:a1:0f:2a}) = 0 ioctl(3, SIOCGIFHWADDR, {ifr_name="vboxnet0", ifr_hwaddr=0a:00:27:00:00:00}) = 0

[/code]

und koppel die Programme an die MAC-Adresse.

Das hilft gar nicht. Die MAC-Adresse des Raspi ist frei programmierbar ...

das wusste ich nicht. Dann muss irgendetwas anderes Unveränderbares abgefragt werden, wenn es das denn gibt.

Du brauchst eine individuelle Kennung für jeden einzelnen Raspi, die nicht verändert werden kann. Die CPU hat eine ID, auslesbar über /proc/cpuinfo. Die scheint fest in der CPU einprogrammiert zu sein. Das Problem bleibt aber das selbe: Du mußt die ID auslesen, in einem Stück, und genau das kann ich abfangen und Dir eine andere ID unterschieben.

Ob Du DANACH if (get_code()==expected_code) oder hardcorecrypto(get_code(),...) schreibst, ist egal. Da ist das Kind schon in den Brunnen gefallen.

Wenn Du Programmcode ernsthaft schützen willst, kommst Du kaum darum herum, einen Hardware-Dongle einzusetzen. Der Dongle berechnet aus einem Stückchen Daten aus Deinem Programm und einem manipulationssicher im Dongle aufbewartem Geheimnis eine Antwort, die wiederum nutzt Dein Programm, um ein benötigtes Stücken Code freizugeben. Schlägt das fehl, bricht das Programm ab bzw. verlangt nach dem Dongle.

Auch Dongles sind nicht perfekt und können umgangen werden, aber sie sind eine deutlich größere Hürde als Gebastel mit CPU-ID oder MAC-Adresse. Denn der Dongle gibt das gespeicherte Geheimnis idealerweise gar nicht preis. CPU-ID und insbesondere die MAC-Adresse sind nicht einmal ansatzweise geheim.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".