Frage:
Wie soll die Sicherheit des Quellcodes überprüft werden?
tonychow0929
2018-10-26 17:37:57 UTC
view on stackexchange narkive permalink

Wie kann überprüft werden, ob der Quellcode eines Open Source-Projekts keinen schädlichen Inhalt enthält? In einer Reihe von Quellcodedateien mit insgesamt 30.000 Zeilen können beispielsweise 1-2 Zeilen eine böswillige Anweisung enthalten (z. B. Aufruf von curl http: // ... | bash ).

Diese Projekte sind nicht bekannt und es kann nicht davon ausgegangen werden, dass sie gut gepflegt sind. Daher kann die Sicherheit der Wiederverwendung des Projektquellcodes nicht einfach auf blindem Vertrauen beruhen (obwohl es eine vernünftige Annahme sein sollte, dass das sichere Herunterladen, Überprüfen, Kompilieren und Ausführen von cmake sicher ist, ist dies nicht der Fall. Es klingt nicht gut, blind eine beliebige Bibliothek zu verwenden, die auf GitHub gehostet wird.

Jemand schlug vor, den Quellcode zu filtern und alle nicht-ASCII- und unsichtbaren Zeichen zu entfernen (mit Ausnahme einiger trivialer Zeichen wie Zeilenumbrüche). Öffnen Sie dann jede Datei mit einem Texteditor und lesen Sie jede Zeile manuell. Dies ist etwas zeitaufwändig, erfordert beim Lesen des Codes volle Aufmerksamkeit und ist tatsächlich ziemlich fehleranfällig.

Daher suche ich nach allgemeinen Methoden, um mit solchen Situationen umzugehen. Gibt es beispielsweise Standardwerkzeuge? Was muss ich beachten, wenn ich wirklich manuell lesen muss?

Es gibt statische Code-Analysatoren.Haben Sie sich diese Tools angesehen?
Ja, aber ich habe das (möglicherweise falsche) Gefühl, dass sie eine schwarze Liste anstelle einer Whitelist (so etwas wie Antivirus) verwenden, die für speziell gestaltete bösartige Inhalte wenig Sinn macht.
SAST ist nicht nur ein musterbasiertes Blacklisting-Tool, sondern auch komplexer.Die ausgereifte SAST-Lösung sammelt jeden Eingabe- und Ausgabepunkt einer Anwendung, erstellt alle möglichen Datenflüsse zwischen ihnen und analysiert dann jeden internen Punkt, an dem unbeabsichtigtes Verhalten wie Datenmanipulationen auftreten kann.
Für Pakete in den Sprachen npm / python, in denen sie von Entwicklern absichtlich in Dutzenden verwendet werden, gibt es beispielsweise keinen Überprüfungsprozess, um eine Komponente zu akzeptieren.Konzentrieren Sie sich auf ein bestimmtes Ökosystem, um die Frage weniger allgemein zu halten?
Nicht ganz.Ich arbeite hauptsächlich mit mobilen Anwendungen und es werden viele Programmiersprachen verwendet, z.Swift (mit Xcode), Java (sowohl Android- als auch Serverseite), C ++ (Freigabecode), JavaScript, Dart usw.
Führen Sie das Projekt in einem Docker-Container mit den geringsten Funktionen aus, die es benötigen sollte, und erteilen Sie ihm die Berechtigung, nur die benötigten Dateien zu ändern.Wenn das Programm aufgrund eines Berechtigungsfehlers fehlschlägt, überprüfen Sie, was es versucht.Wenn die Anfrage legitim ist, erlauben Sie es und fahren Sie fort, sonst haben Sie etwas faul gefunden.
Das ist eine gute Frage.Theoretisch könnte viel getan werden, aber in der Praxis vertrauen die meisten Menschen nur Abhängigkeiten.Ein Problem ist, dass die besten Codeanalysatoren teure kommerzielle Tools sind.Obwohl es für einige Sprachen gute kostenlose Tools gibt.Subtiler Unterschied zwischen der Feststellung, ob Code böswillig ist oder ob er Sicherheitslücken aufweist.
Beachten Sie, dass es [ziemlich schwierig sein kann] (https://en.wikipedia.org/wiki/Underhanded_C_Contest) festzustellen, ob eine Software schädlichen Inhalt enthält, wenn der Autor sich bemüht hat, ihn zu verbergen.
Die von Ihnen aufgelisteten schnellen Lösungen berücksichtigen keine kniffligen Taktiken, z. B. wenn der Code auf Basis 64 codiert oder auf andere Weise verdeckt ist.
@Bakuriu Ich möchte hinzufügen, dass Sie alle Systemaufrufe "straffen" und sehen können, ob etwas faul ist, zum Beispiel die Anwendung, die versucht, Dateien zu statisieren, um die sie sich nicht kümmern muss.
Fünf antworten:
odo
2018-10-26 17:51:22 UTC
view on stackexchange narkive permalink

Es gibt automatisierte und manuelle Ansätze.

Für die Automatisierung können Sie mit lgtm beginnen - einem kostenlosen statischen Code-Analysator für Open Source-Projekte und dann zu komplexeren SAST-Lösungen wechseln

Für das Handbuch - Sie können ein Bedrohungsmodell Ihrer App erstellen und es anhand der OWASP ASVS -Checkliste ausführen, beginnend mit den wichtigsten Teilen. Wenn in Ihrem Bedrohungsmodell Dateien gelöscht werden, rufen Sie einfach Folgendes auf: grep -ir 'os.remove (' .

Natürlich ist es besser, beide zu kombinieren.

"Wenn in Ihrem Bedrohungsmodell Dateien gelöscht werden, rufen Sie einfach Folgendes auf:" grep -ir "os.remove (". ": Wenn ich" os ["remove"] mache ("Ich habe sofort besiegt")Sie.
@The6P4C Dann ist es ein weiteres Vertrauensproblem in Bezug auf die Codierungskonvention, obwohl bösartiger Code häufig absichtlich getarnt wird.
@The6P4C sicher, wenn "grep" mein einziges Werkzeug war.Aber nicht so einfach, da Ihr Exploit mit "os \ W + remove \ W +" erkannt werden konnte.
@odo dann würde ich "os.unlink" oder sogar "shutil.move" machen.Gegen einen leicht entschlossenen Angreifer hat dieser Ansatz keine Chance.
Ángel
2018-10-26 21:04:40 UTC
view on stackexchange narkive permalink

Sie tun es entweder selbst oder vertrauen jemand anderem

Wie bei den meisten Dingen im Leben müssen Sie es entweder selbst tun oder jemand anderem vertrauen. Hier umfasst Vertrauen sowohl das Fehlen einer böswilligen Absicht als auch die Kompetenz, die Aufgabe ordnungsgemäß auszuführen.

Sie können beispielsweise Ihre Steuern selbst oder vertraue einem Steuerberater (der nicht nur nicht versuchen sollte, dich zu betrügen, sondern auch weiß, wie man die Steuern einreicht!).

Wenn Sie ein Unternehmen sind, es selbst zu tun wird tatsächlich von einem oder mehreren Ihrer Mitarbeiter ausgeführt, denen wiederum vertraut werden muss.

Der Dritte, dem Sie vertrauen, muss kein einzelner sein Person auch. Dies kann das Microsoft Windows-Entwicklungsteam oder die Wordpress-Kernentwickler sein.

In Bezug auf die Quellcodesicherheit möchten Sie, dass der Experte nicht nur gut ist -bedeutend, aber auch sachkundig, um das Programm auf sichere Weise zu codieren / mögliche Sicherheitsprobleme zu finden.

(plus ein paar zusätzliche Grenzsysteme, wenn sie als Ganzes behandelt werden, z. B. wenn Sie das möchten Ihr Code wurde nicht kompromittiert, während sie ihn in das Repository hochgeladen haben, oder die E-Mail Ihres Mitarbeiters, in der angegeben wird, dass die Ergebnisse durch einen böswilligen Hacker in Ihrem Netzwerk ersetzt wurden, um zu bestätigen, dass die Anwendung in Ordnung war.

Sie benötigen Um Ihre Optionen zu bewerten, bewerten Sie das mit jedem einzelne Risiko verbundene Risiko und wählen Sie den Pfad, der Ihren Interessen (und Ihrem Budget!) am besten entspricht.

Wenn ich die Sicherheit des Quellcodes eines Blogs überprüfen würde, wäre dies Wenn ich Wordpress verwende, würde ich im Allgemeinen darauf vertrauen , dass der ursprüngliche Code in Ordnung ist1¹ und die Unterschiede zwischen der offiziellen und der verwendeten Version überprüfen. Wenn die Website kompromittiert würde, wäre dies viel einfacher herauszufinden.

¹ Überprüfen Sie offensichtlich das Änderungsprotokoll späterer Versionen, wenn es ein veraltetes verwendet.

Wenn es jedoch vom Neffen des Besitzers entwickelt wurde, würde ich erwarten, dort viele Schwachstellen zu finden, und würde eine gründliche Überprüfung von allem empfehlen.

In Ihrem Fall sollten Sie das bewerten Risiko und Kosten für die Entwicklung des Äquivalents dieser Bibliothek (berücksichtigen Sie, dass die Wahrscheinlichkeit von Problemen mit Ihrem Inhouse-Produkt ebenfalls nicht Null ist und unter anderem von der Qualität der beteiligten Personen abhängt) im Vergleich zum Risiko und Kosten für die Prüfung und Verwendung dieser Bibliothek.

Nun kann es abschwächende Faktoren geben, die die Prüfung vereinfachen. Wenn der nicht vertrauenswürdige Code beispielsweise in einer isolierten virtuellen Maschine ausgeführt werden kann, reicht dies möglicherweise aus, um keine weitere Überwachung zu erfordern (auch hier vertrauen Sie der VM-Implementierung). Oder es kann als ausreichend angesehen werden, die Teile dieses Programms zu prüfen, die als Root ausgeführt werden.

Zum Prüfen einer Bibliothek können Codeanalysatoren helfen, problematische Teile (wie bereits erwähnt) aufzuzeigen, aber um dies zu berücksichtigen Um sauber zu sein, hätte ich tatsächlich jemanden, der den Code liest und versteht, auch wenn er oberflächlich ist.

Zum Beispiel ist die Fähigkeit, beliebige Dateien zu entfernen, an sich nicht böswillig / em>. Sie müssen das Programm verstehen, um zu wissen, ob es sinnvoll ist.

Auch hier geht es um die Bedrohungen und Risiken für das, was Sie tun. Wenn Sie sich nur mit der Exfiltration von Daten durch die Bibliothek befassen, kann es ausreichend sein, Verbindungen an der Firewall zu filtern. Wenn Sie Bedenken haben, dass die Bibliothek wichtige Dateien löscht (und aus irgendeinem Grund können Sie eine solche Berechtigung nicht verweigern), können Sie einfach durch eine Reihe von Codes scrollen, die nur mathematische Berechnungen durchgeführt haben. Wenn diese Bibliothek die Parameter für den Start einer Rakete berechnet ... stellen Sie sicher, dass auch diese Berechnungen korrekt sind!

DawnPaladin
2018-10-27 03:04:28 UTC
view on stackexchange narkive permalink

Verwenden eines Dienstes

Es gibt professionelle Dienste wie Black Duck und Whitesource, die Open-Source-Abhängigkeiten prüfen.

Black Duck überprüft den Code der Betriebssystemabhängigkeiten nicht.Sie prüfen, ob die Abhängigkeit (in der mit Ihrer App gelieferten Version) eine ** bekannte ** Sicherheitslücke aufweist, die in CVE-Datenbanken aufgeführt ist.Bitte korrigieren Sie mich, wenn ich falsch liege.Quelle: Ich erhalte regelmäßig BlackDuck-Berichte von einem unserer Kunden.
Ich würde auch VeraCode (veracode.com) auflisten / empfehlen.Ich bin nicht verbunden.Meine Firma hat es einmal benutzt.Es durchsucht Ihre nicht verschleierten Binärdateien, also auch den OSS-Code, nach bekannten Schwachstellenmustern.Shell-Befehle, die Verwendung alter kryptografischer Algorithmen, "Phone-Home" -Aufrufe und andere Muster werden zusammen mit XSS-, CSRF-Schwachstellen usw. gescannt.
symcbean
2018-10-26 18:12:56 UTC
view on stackexchange narkive permalink

Wenn Sie anderen Code verwenden, sind Sie mehr oder weniger den Integritätsmechanismen ausgeliefert, die die Betreuer bereitstellen - dies gilt für alle Software, nicht nur für Open Source.

Sowohl für kommerzielle als auch für kommerzielle Zwecke Gepackte Open-Source-Software (z. B. RPM, Deb usw.) ist häufig signiert. Dies zeigt, dass Sie das erhalten haben, was der Unterzeichner beabsichtigt hat.

Im Fall von Quellcode werden normalerweise Prüfsummen verwendet . Dies hat jedoch nur einen geringen Wert, wenn auf die Prüfsumme von einer anderen Quelle als dem Quellcode aus zugegriffen werden kann.

Beachten Sie, dass diese nur zum Schutz vor einem MITM-Angriff auf die Anwendung gedacht sind.

Verwenden Sie eine beliebige Bibliothek, die auf GitHub gehostet wird.

... In diesem Fall haben alle Dateien / Versionen einen auf Github veröffentlichten Hash. Um dies zu untergraben, muss ein Angreifer dies tun Github selbst oder das Github-Konto des Betreuers untergraben - Ich kann alles auf Github teilen, aber es wird mir dann zugeschrieben und das ursprüngliche Repository bleibt davon unberührt, es sei denn, der Betreuer akzeptiert meine Pull-Anforderungen. Möglicherweise haben Sie mehr Vertrauen in die Integrität von Github als die Betreuer des Codes. In diesem Fall ist es sinnvoll, einem Hash zu vertrauen, der an derselben Stelle wie der Quellcode veröffentlicht wurde.

Keiner dieser Mechanismen bietet Schutz vor Malware, die injiziert wurde, bevor die Integritätsprüfung angewendet wurde.

Wenn Sie Zugriff auf den Quellcode haben, haben Sie die Möglichkeit, den Code zu überprüfen (was viel einfacher ist als das Überprüfen der ausführbaren Dateien) und Hierfür gibt es automatisierte Tools, wie sie Odo vorschlägt.

Ultimate Hawk
2018-10-29 14:41:24 UTC
view on stackexchange narkive permalink

Statische Analysatoren funktionieren nicht immer

Überprüfungen auf os.remove an einer beliebigen Stelle im Code funktionieren nicht bei allen Angreifern, da einige möglicherweise einfach auswerten (" os "+" .remove ") . Es können noch fortgeschrittenere reguläre Ausdrücke erstellt werden, aber der Angreifer kann seinen Code immer komplizierter gestalten. Beispiel:

  x = "r" eval ("os." + X + "emove") )  

Theoretisch ist es aufgrund des Stoppproblems unmöglich, alle potenziellen Zustände zu überprüfen, um festzustellen, ob ein gefährlicher Systemaufruf aufgerufen wird.

Ein Angreifer kann statische Aufladung vermeiden Code-Analysatoren ganz einfach, indem Sie einen kleinen Interpreter für eine benutzerdefinierte Sprache erstellen, die die böswilligen Vorgänge ausführt.

Ausführen des Codes in einem Container / Honeypot

Die gesamte Software interagiert schließlich mit dem Betriebssystem. Wenn Sie die Software in einem Container oder Honeypot mit strace oder einem ähnlichen Tool ausführen, können Sie sehen, welche Informationen das Programm oder die Bibliothek zu sammeln versucht.

Versucht das Programm, eine Abbildung zu erstellen raus, wenn es in einem Container läuft? Liest es Dateien, die es nicht soll, oder ändert es sie sogar? Dann haben Sie möglicherweise eine schädliche Software.

Dies funktioniert nicht immer. Möglicherweise ist eine manuelle Überprüfung erforderlich.

Einige bösartige Codes werden nur an bestimmten Daten ausgelöst, aber zumindest Sie Ich werde sehen, dass darauf zugegriffen wird. Von dort aus können Sie überprüfen, wo im Code dies geschieht und warum.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
Loading...