Software-Schutz verhindert Kopieren und Reverse-Engineering
Beweisbare Sicherheit
Software hat einen immer größeren Anteil an der Wertschöpfung und muss daher besonders geschützt werden. Bisher mussten entsprechende Verfahren geheim gehalten werden, um sicher zu bleiben. Ein neues Verfahren nach dem Kerckhoffs'schen Prinzip ermöglicht hingegen einen beweisbar sicheren und korrekten Software-Schutz. Dabei beruht die Sicherheit auf der Geheimhaltung von Schlüsseln, einer geschützten Hardware und der inhärenten Komplexität der zu schützenden Software. Für diese Leistung wurden die Hersteller/Anbieter mit dem ersten Platz beim 5. Deutschen IT-Sicherheitspreis ausgezeichnet.
Weil Software prinzipiell kopier- und manipulierbar ist, verwendet das Blurry-Box-Verfahren mit dem CmStick eine sichere Hardware, die nicht kopiert oder verändert werden kann. Das Verfahren bindet nun den auszuführenden Programmcode so an den Stick, dass die Software ohne ihn nicht lauffähig ist. Dies geschieht aber nicht durch simple Aufrufe, die überprüfen, ob der CmStick antwortet. Denn solche Aufrufe könnten einfach aus dem Programm auskommentiert werden; auch wird nicht das Programm einfach verschlüsselt und dann vor der Programmausführung vom CmStick entschlüsselt. Denn dann läge das ausführbare Programm im Speicher und könnte wieder kopiert und manipuliert werden. Das Blurry-Box-Verfahren unterteilt das Programm in viele Funktionsblöcke, die jeweils Eingabe- und davon abhängige Ausgabeparameter umfassen, und verschlüsselt diese. Das Verfahren vervielfältigt jeden dieser Funktionsblöcke und verändert den Programmablauf so, dass die Auswahl aus den vervielfältigten Funktionsblöcken abhängig von den Aufrufparametern erfolgt. Die Auswahl des Funktionsblocks übernimmt dabei eine Wrapper-Funktion. Dadurch wird erreicht, dass die Codeabdeckung bei einem Durchlauf stark verringert wird und zusätzlich von den verwendeten Eingabeparametern abhängig ist.
Angriff unwirksam
Ein Hacker könnte versuchen, durch das Ändern der Wrapper-Funktion die Auswahlfunktion zu umgehen, sodass von den vervielfältigten Funktionsblöcken immer der gleiche ausgewählt wird. Das Blurry-Box-Verfahren macht einen solchen Angriff unwirksam, indem die vervielfältigten Funktionsblöcke jeweils so zu Varianten modifiziert werden, dass sie nur für den vorgesehenen Wertebereich korrekt funktionieren. Da das Programm über eine hinreichende inhärente Komplexität verfügt und dem Hacker das notwendige Fachwissen fehlt, ist nicht davon auszugehen, dass er bislang unbekannte Varianten oder den ursprünglichen Funktionsblock ableiten kann. Diese Annahme ist für den Sicherheitsbeweis des Verfahrens wichtig und wird Fachlichkeitsannahme genannt. Wird eine Variante mit den falschen Aufrufparametern benutzt, dann liefert diese Variante falsche Ergebnisse für die nicht vorgesehenen Parameterwerte. Gemäß der Fachlichkeitsannahme fehlt dem Angreifer das Fachwissen, um diese Ergebnisse zu korrigieren und er muss somit alle Varianten durch seinen Angriff erhalten, um eine vollständig funktionsfähige Kopie der Software zu erzeugen. Jede einzelne Variante wird vom Blurry-Box-Verfahren verschlüsselt und die Schlüssel für alle Varianten im CmStick sicher abgelegt. Die Entschlüsselung erfolgt über die API-Funktion des Sticks, indem die verschlüsselte Daten ins Stick-Innere übertragen werden und dort mit Hilfe der vorliegenden Schlüssel entschlüsselt werden. Der entschlüsselte Programmcode wird als Rückgabewert der CmDongle-API zurückgeliefert und in der Software als Code der Variante ausgeführt. Eine Variante kann nur mit dem CmStick entschlüsselt werden. Zur Verschlüsselung wird der Advanced Encryption Standard (AES) verwendet. Um Blöcke mit gleichem Inhalt auf unterschiedliche Chiffrate abzubilden, fließt in die Berechnung ein zufällig gewählter Wert mit ein.
Fallen für den Angreifer
Ein Teil der verschlüsselten Daten gehört nicht zum Programm und werden in einem normalen Programmlauf nie verwendet. Diese Daten entsprechen Varianten, die für keinen möglichen Aufrufwert vom Wrapper ausgewählt werden. Wird der CmStick aufgefordert solch eine Variante zu entschlüsseln, so wird diese erkannt. Der Stick markiert die Lizenz als ungültig und ermöglicht damit keine weiteren Entschlüsselungen. Solche sogenannten Fallen hindern einen Angreifer, alle verschlüsselt vorliegenden Varianten unabhängig vom Programmlauf durch den CmStick zu entschlüsseln. Werden im Programm zusätzlich Sprünge auf solche Fallen eingefügt, die bei einem normalen Programmlauf nie auftreten, so wirken die Fallen sowohl bei einem statischen Angreifer, dessen Angriff unabhängig vom Programmlauf ist, als auch bei Angreifern, die den Code durch Decompilierung analysieren und allen Sprungadressen folgen. Das Code Moving, also das Ausführen von Programmcode in einer geschützten Hardware, verlangsamt im Allgemeinen die geschützte Anwendung und ist somit in der Regel nicht praktikabel. Auch eine Auswahl von besonders wichtigen Funktionsblöcken, die per Code Moving im Dongle ausgeführt werden sollen, ist nicht praktikabel, da diese wichtigen Funktionsblöcke dadurch stark verlangsamt würden. Sehr sinnvoll ist das Code Moving dagegen für den Code zur Berechnung der Variantenauswahl, denn dieser ist sehr kurz und essentiell für die korrekte Programmausführung. Diese Form des Code Moving kann sogar größtenteils automatisiert werden und ist dann nur auf wenig Interaktion mit dem Programmentwickler angewiesen. Ein Angriff, der von einer normalen Programmausführung abweicht, kann nicht nur über Fallen erkannt werden, sondern auch an der Reihenfolge, in der Blöcke vom CmStick entschlüsselt werden. Während eines regulären Ablaufs des Programmcodes ist diese Reihenfolge nicht beliebig und auf einen Block kann nur eine kleine Teilmenge aller Blöcke folgen. Ein Gedächtnis des CmSticks ermöglicht es der Blurry Box-Technologie, gültige von ungültigen Abfolgen zu unterscheiden und eine Sperre auszulösen, sobald eine ungültige Abfolge versucht wird.
Sicherheit durch Beweis und Fachlichkeit
Kerckhoffs Prinzip besagt, dass das verwendete kryptographische Verfahren nicht geheim sein sollte, sondern nur die verwendeten Schlüssel. Es ist ein wichtiger Grundpfeiler der modernen Kryptographie, denn nur so können kryptographische Verfahren öffentlich diskutiert, kritisiert und verbessert werden. Kerckhoffs Prinzip erlaubt darüber hinaus sogar eine beweisbare Sicherheit. Darunter versteht man nicht, dass es einen Beweis absoluter Sicherheit gibt, sondern ein systematisches Vorgehen, mit dem man große Klassen von Angriffen wirksam ausschließen kann. Zuerst wird eine Modellwelt definiert, die von der realen Welt abstrahiert. Dann werden Sicherheitsannahmen explizit aufgeführt und zuletzt wird ein mathematischer Beweis angegeben, dass unter den getroffenen Sicherheitsannahmen innerhalb der Modellwelt kein Angriff möglich ist. Jeder erfolgreiche Angreifer muss also das Modell verlassen. Lässt sich sein Angriff im Modell formulieren, so kann er nicht erfolgreich sein. Bei dieser Herangehensweise führt jeder gefundene Angriff zu einem Erkenntnisgewinn, denn es wird gezeigt, dass das Modell nicht realistisch ist oder die getroffenen Annahmen falsch sind.
Zwei Modellwelten
Für Blurry Box wurden zwei Modellwelten betrachtet. Eine für statische Angreifer, die unabhängig vom Kontrollfluss des Programms angreifen, und dynamische Angreifer, die den Kontrollfluss berücksichtigen. Statische Angreifer bleiben erfolgreich, selbst wenn man den Kontrollfluss ändert. Dadurch werden aber Fallen, verschlüsselte Codestücke, die den CmStick sperren, und andere verschlüsselte Varianten ununterscheidbar unter der Annahme, dass die Verschlüsselung sicher ist. Ein erfolgreicher statischer Angreifer muss aber die Fallen erkennen, ohne den CmStick aufzurufen, was er nur kann, wenn die Annahme (sichere Verschlüsselung) falsch ist. Ein dynamischer Angreifer, der das Programm benutzt bis er eine vollständige Abdeckung aller Varianten erreicht hat, könnte prinzipiell erfolgreich sein. Um Sicherheit gegen solche Angriffe zu zeigen, benötigt man zusätzlich Annahmen über die inhärente Komplexität der zu schützenden Software, die eine vollständige Benutzung der Software praktisch unmöglich macht. Das Blurry-Box-Verfahren ist zwar beweisbar sicher, dennoch soll ein Hacker-Contest ausgelobt werden. Denn beweisbare Sicherheit gilt immer nur in einer Modellwelt relativ zu Sicherheitsannahmen. Ob diese Annahmen gerechtfertigt sind und das Modell realistisch ist, wird der Contest zeigen.
Software hat einen immer größeren Anteil an der Wertschöpfung und muss daher besonders geschützt werden. Bisher mussten entsprechende Verfahren geheim gehalten werden, um sicher zu bleiben. Ein neues Verfahren nach dem Kerckhoffs'schen Prinzip ermöglicht hingegen einen beweisbar sicheren und korrekten Software-Schutz. Dabei beruht die Sicherheit auf der Geheimhaltung von Schlüsseln, einer geschützten Hardware und der inhärenten Komplexität der zu schützenden Software. Für diese Leistung wurden die Hersteller/Anbieter mit dem ersten Platz beim 5. Deutschen IT-Sicherheitspreis ausgezeichnet.
Weil Software prinzipiell kopier- und manipulierbar ist, verwendet das Blurry-Box-Verfahren mit dem CmStick eine sichere Hardware, die nicht kopiert oder verändert werden kann. Das Verfahren bindet nun den auszuführenden Programmcode so an den Stick, dass die Software ohne ihn nicht lauffähig ist. Dies geschieht aber nicht durch simple Aufrufe, die überprüfen, ob der CmStick antwortet. Denn solche Aufrufe könnten einfach aus dem Programm auskommentiert werden; auch wird nicht das Programm einfach verschlüsselt und dann vor der Programmausführung vom CmStick entschlüsselt. Denn dann läge das ausführbare Programm im Speicher und könnte wieder kopiert und manipuliert werden. Das Blurry-Box-Verfahren unterteilt das Programm in viele Funktionsblöcke, die jeweils Eingabe- und davon abhängige Ausgabeparameter umfassen, und verschlüsselt diese. Das Verfahren vervielfältigt jeden dieser Funktionsblöcke und verändert den Programmablauf so, dass die Auswahl aus den vervielfältigten Funktionsblöcken abhängig von den Aufrufparametern erfolgt. Die Auswahl des Funktionsblocks übernimmt dabei eine Wrapper-Funktion. Dadurch wird erreicht, dass die Codeabdeckung bei einem Durchlauf stark verringert wird und zusätzlich von den verwendeten Eingabeparametern abhängig ist.
WIBU-Systems AG
Dieser Artikel erschien in SPS-MAGAZIN 7 2015 - 09.07.15.Für weitere Artikel besuchen Sie www.sps-magazin.de