Fuzzing Zcash mit Kubernetes – Electric Coin Company

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining


Sicherheit ist für den Erfolg von Zcash und ECC von größter Bedeutung. Daher investieren wir erhebliche Ressourcen in die Sicherheit. Wir lassen alle Netzwerk-Upgrade-Designs und -Implementierungen von seriösen externen Anbietern bewerten und veröffentlichen diese Ergebnisse vollständig. Wir bemühen uns auch intern, Sicherheitsprobleme zu erkennen und zu verhindern. In diesem Beitrag beschreiben wir eine solche Anstrengung, die im dritten Quartal 2020 unternommen wurde.

Wir haben uns ein aggressives Q3-Ziel für die Suche nach Sicherheitslücken in zcash / zcash gesetzt und entschieden, dass Fuzzing Teil des Ansatzes sein sollte: Wir haben Kubernetes und libFuzzer zusammen mit ein paar Tricks um unser altes Build-System verwendet, um die Suche zu starten.

Bisher hat der von uns zusammengestellte private Cluster seine Skalierungsgrenzen innerhalb unseres Budgets nicht erreicht und 500.000 reale Ausführungen pro Sekunde mit präemptiblen VMs in GKE erreicht.

Prelink ist tot und die Sicherheit hat ihn getötet

Vor der NU3-Sicherheitsbewertung (die zu Recht ein unflexibles Build-System und einen Mangel an Fuzzing hervorhob) wurden bereits einige Anstrengungen unternommen, um AFL in das zcash / zcash-Repository und auch in ein System zur Parallelisierung des Fuzzing in einem Kubernetes-Cluster zu integrieren.

Als wir uns mit der Bewertung befassten, wollte ich die Fuzzer-Ausführung mit AFL optimieren, um von einer Basislinie (mit einem trivialen Eingabefall) von Hunderten von Exec / s / Core zu einem Bereich im Tausenderbereich auf einer CPU mittlerer Ebene zu gelangen . Beim Fuzzing ist es wichtig, dass die von Ihnen verwendete Testfallgenerierung die bestmögliche Chance hat, Abstürze und Hänge zu finden, indem Sie so viele Testfälle wie möglich pro Sekunde testen.

Während Trail of Bits (ToB) an dieser Bewertung arbeitete, stellte ich fest, dass "Prelink" leider nicht mit (ironischerweise) Sicherheitsupgrades für den Linux-Loader Schritt gehalten hat, was bedeutet, dass er nicht mehr mit gebauten Binärdateien funktioniert für ein modernes Linux-System. Der mir bekannte Hauptanwendungsfall schien darin zu bestehen, dass Administratoren eine Binärdatei an anderer Stelle zufällig neu basieren (allerdings nur einmal, wenn der Prelink aufgerufen wird), um eine Art ASLR zu implementieren. Nun, Linux hat dieses Recht jetzt im dynamischen Loader, und die neuen Abschnitte, die zur Unterstützung dieser Funktionalität verwendet werden, werden den Prelink verwirren. Ohne Prelink kann die vergleichsweise Langsamkeit von AFL bei einem direkten Aufruf einer Bibliotheksfunktion, die den Testfall ausführt, nicht ignoriert werden. Da wir offensichtlich nicht für die CPU-Zeit zahlen müssen, um eine Binärdatei immer wieder dynamisch zu verknüpfen, und eine einfache Methode zur Vorberechnung dieses Teils nicht mehr vorhanden ist, wurde eine andere Lösung benötigt.

Entsprechend den Ergebnissen aus dem NU3-Bericht sind wir stattdessen zu libFuzzer übergegangen. Da es sich nur um einen Bibliotheksaufruf für jeden Eingabetestfall handelt, ist es im Hinblick auf die Ausführungsgeschwindigkeit des Testfalls bereits recht gut optimiert – obwohl eine libFuzzer-Binärdatei natürlich immer noch viele Wählscheiben enthält, um das Auffinden von Problemen weiter zu optimieren.

Die Verwendung von Clang / LLVM war eine echte Freude. Es ist eine großartige Suite von Tools, mit denen ich vorher noch nicht viel arbeiten konnte. Ich konnte die Build-Integration für libFuzzer in zcash / zcash aus dem bereits für AFL vorhandenen Code ableiten und eine Methode zur massiven Skalierung aus dem vorhandenen Parallelisierungsframework ableiten, das ich für AFL entwickelt hatte. Das Synchronisationsparadigma ist gar nicht so unterschiedlich.

Ausweichen aus einem „unflexiblen Build-System“

Ich sollte nur erwähnen, dass der Bericht hervorgehoben hat, dass das Build-System für zcash / zcash etwas unflexibel ist. Obwohl es zuverlässig ist und zcashd reproduzierbar erstellt (was wir im Kontext als wichtiges Sicherheitsmerkmal betrachten), ist es etwas unflexibel und schwierig zu ändern und zu warten. Es ist etwas, das wir von Bitcoin verwendet haben, aber nicht die Macht der Leute haben, es zu ersetzen.

Angesichts begrenzter Ressourcen schien es kein angemessener Kompromiss zu sein, das System zu ersetzen, insbesondere auf Kosten anderer wichtiger Bemühungen, aber ich konnte vorhandene Eingaben nutzen und es libFuzzer-Binärdateien anstelle des ursprünglichen zcashd ausgeben lassen .

Durch unsere Integration wird der Compiler (CC, CXX) als Wrapper-Skript festgelegt, das die an ihn übergebenen Argumente analysiert, Anpassungen vornimmt (z. B. pie vs pic, Aktivieren von Desinfektionsprogrammen und Anpassen der Verknüpfung) und dann den ursprünglichen Compiler aufruft. Dies vermeidet, dass Änderungen am Build-System vorgenommen und de facto Eigentümer und Verwalter des Build-Systems werden müssen – auf Kosten einer geringfügigen Erhöhung des Impulses und der Schwierigkeit, wenn sich jemand dazu entscheidet, dies in Zukunft zu tun. Ich staple mehr Dinge auf einem unflexiblen System, aber dies entspricht unserem Geschäftsplan.

Auf diese Weise können wir:

  • Fügen Sie libFuzzer-Instrumente nur bedingt in die von uns benötigten Module ein
  • Injizieren Sie bedingt andere Desinfektionsinstrumente nur in die von uns benötigten Module
  • Vermeiden Sie es, das Eigentum an der Wartung des gesamten Build-Systems zu untergraben
  • Entfernen Sie die Anforderung, dass Fuzzer-Autoren in den Linker integriert werden müssen

Zu diesem letzten Punkt: Dieser Ansatz ermöglicht den Zugriff auf alle Funktionen innerhalb des Monolithen, ohne dass ein Fuzzer-Autor entscheiden muss, mit was verknüpft oder erstellt werden soll. Dies klingt nach einer geringfügigen Verbesserung, kommt jedoch besonders gut zur Geltung, wenn Sie sich die Mühe machen, Fuzzers an andere zu schreiben. Wenn dies ein Schritt ist, der vermieden werden kann, lassen Sie es uns vermeiden.

Die private Parallelisierung ist jetzt einfach

Wir verfügen nur über begrenzte Ressourcen, um eine Codebasis im Verhältnis zu einer Marktkapitalisierung zu sichern, die weit über das Vermögen unseres eigenen Unternehmens hinausgeht.

Dies stellt die Sicherheit vor interessante Herausforderungen. Bei fast jedem System, auf das wir uns verlassen, wird eine Art Risikokontrolle angewendet, sodass das verbleibende Risiko verstanden wird. Wie sicher sind beispielsweise die Fuzzing-Cluster anderer Personen? Wie können wir der zugrunde liegenden Infrastruktur Überwachungs- und Risikominderungsstrategien hinzufügen? Sicherheitslücken in einer Open-Source-Kryptowährung sind eine schwierige Sache. Wer würde das tun und sind sie auf unsere Mission ausgerichtet?

Es ist auch so, dass OSS-Fuzz / ClusterFuzz weitaus umfassender ausgestattet sind, als wir wahrscheinlich benötigen, und sie wurden auch zu einer Zeit konzipiert, in der die Parallelisierung gängiger Computeraufgaben in Clustern schwieriger war als heute. Zu dieser Zeit war es äußerst vorausschauend, das Fuzzing zu parallelisieren, aber dankenswerterweise hat die Allzweckparallelisierung jetzt die Aspekte des gemeinsam genutzten Speichers, der Clusterverwaltung, der parallelen Ausführung und der Verwaltung des Joblebenszyklus erfasst.

Aus diesen Gründen haben wir unsere eigene private Parallelisierung zum Fuzzing. Es basiert auf Kubernetes und kann trivial ausgelöst werden. Es verwendet präemptive Knoten, Cluster mit automatischer Skalierung und redundanten Speicher, um das Korpuswachstum aufrechtzuerhalten und über einen Synchronisierungsjob gemeinsam zu nutzen.

Open Source?

Ich hoffe, dass wir das Stadium erreichen, in dem wir das Parallelisierungsstück als Open Source veröffentlichen, aber da es das Allzweck-Clustering wiederverwendet, ist es nicht sehr groß oder komplex und bietet wahrscheinlich nicht allzu viel Wert für jeden, der dies tun möchte alles andere als zcashd zu verwirren. Zeit und Mühe müssen aufgewendet werden, um es für andere nützlich zu machen, und ehrlich gesagt war die gesamte Übung eine davon, wie viel wir mit wie wenig anfangen können.

Können wir die Abdeckung von Sicherheitstests auslagern?

Sobald intern gezeigt wurde, dass die Fuzzing-Plattform, über die wir verfügen, funktionsfähig ist, können wir Fuzzer an sinnvollen Stellen in die Codebasis einbinden, mit der Erwartung, dass wir sie bald nach dem Festschreiben und Testen in großem Maßstab ausführen können.

Wenn wir an einen Ort gelangen könnten, an dem jeder, der neuen C ++ – Code hinzufügt, denkt, dass Sicherheitstests nur ein Teil der Tests sind, die er hinzufügen muss, dann könnte ein Großteil des schweren Hebens von Kabelbauteilen aus Sicherheitsgründen an Entwickler weitergegeben werden um später zu erweitern. Das wäre ein bisschen ein Kulturwandel, den wir schaffen müssen. Angesichts des großen Interesses und der großen Sicherheitsfähigkeiten des ECC-Teams dachte ich, dass sie eine Herausforderung beim Schreiben und Optimieren von Fuzzern zu schätzen wissen (die Tuning-Bedeutung bietet CLI-Optionen, die sie beschleunigen, einschließlich Korpus und Wörterbuch, aber es gibt viele Optionen in libFuzzer). Ich würde das gerne irgendwann extern ausführen, aber wie alles, was es kostet, führen wir zuerst intern eine kleine Testversion durch.

Clang Unterstützung

Die Unterstützung für Clang / LLVM war nicht sehr lange Teil von zcashd, aber der Macos-Build von zcashd verwendet sie seit einiger Zeit. Es hat die zweite Geige nach dem führenden GCC gespielt, aber (teilweise von dieser Arbeit inspiriert und ganz allein) entschied sich das Kern-Engineering-Team, in zcash / zcash master zu Clang zu wechseln. Hervorragend!

Taylor Hornby hat maßgeblich zu dieser Arbeit und diesem Artikel beigetragen.

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close