Ehrlich gesagt versuchen wir, Ihre Codebasis nicht zu durchsuchen. Wir versuchen, Tools zu schreiben, die dies für uns tun.
Erstens die Theorie. Sicherheit ist eine Anforderung an ein Softwaresystem. Daher sollte sie wie andere Anforderungen (Funktionalität, Benutzerfreundlichkeit, Zugänglichkeit, Leistung usw.) in jeder Phase des Software-Engineering-Workflows von der Erfassung der Anforderungen bis zur Bereitstellung und Wartung berücksichtigt werden. Dies ist in der Tat möglich, und es gibt Anleitungen, die Softwareprojektteams dabei unterstützen. Obwohl ich hauptsächlich mit iOS-Entwicklern zusammenarbeite, stammt meine Lieblingsbeschreibung des "sicheren Entwicklungslebenszyklus" von Microsoft Press .
In diesem Modell beginnt die Anwendungssicherheit, wenn wir versuchen, Anforderungen von unseren Benutzern zu ermitteln. Wir müssen ihre Sicherheits- und Datenschutzbedenken herausfinden, was nicht einfach ist, da wir die Experten und nicht die Benutzer sind und wenn sie ihre Sicherheitsanforderungen verstehen, fällt es ihnen möglicherweise schwer, sie auszudrücken. Wir müssen auch herausfinden, welchen Risiken die Software bei der Bereitstellung ausgesetzt ist und welches Risiko akzeptabel ist.
Wir gestalten unsere Anwendung so, dass diese Anforderungen erfüllt werden. Wir schreiben den Code mit dem Ziel, diese Anforderungen zu erfüllen und zusätzliche Risiken zu vermeiden, die mit Sicherheitsfehlern auf Codeebene verbunden sind. Wir testen die Software, um sicherzustellen, dass unser Sicherheitsmodell mit dem übereinstimmt, was wir wirklich erstellt haben. Anschließend stellen wir die Software so bereit, dass sie den Annahmen entspricht, die wir bei der Entwicklung des Objekts über die Umgebung getroffen haben. Schließlich bieten wir Support und Wartung, die dem Benutzer helfen, die Software in Übereinstimmung mit seinen Sicherheitsanforderungen zu betreiben, und die es ihm (und uns) ermöglichen, auf neuartige Änderungen der dargestellten Risiken zu reagieren.
Ok, so viel zur Theorie. In der Praxis passieren aus Gründen, die in Geekonomics sehr gut (wenn auch nicht technisch) erklärt werden und die hauptsächlich auf die Motivation von Softwareunternehmen zurückzuführen sind, die meisten der oben genannten Dinge nicht. Stattdessen bekommen wir das. Entwickler werden:
- Stellen Sie einen Sicherheitsmann oder eine Sicherheitsfrau ein, um anwesend zu sein, wenn sie für einen Vertrag bieten, um zu zeigen, dass sie Sicherheit "bekommen".
- Software schreiben.
- Stellen Sie einen Sicherheitsmitarbeiter oder eine Sicherheitsfirma ein, um die Software vor der Veröffentlichung zu validieren, und beheben Sie viele Probleme, die in Schritt 2 aufgetreten sind.
- Patchen Sie alles andere nach der Bereitstellung.
Was die meisten Leute für App-Sicherheit wirklich tun, ist, wie Sie sagen, Fehler zu finden. Dies ist wirklich eine verherrlichte Codeüberprüfung, aber es ist eine sehr fokussierte Codeüberprüfung, die von Leuten durchgeführt wird, die Experten für die Art von Fehlern sind, nach denen diese Überprüfung sucht. Daher ist es immer noch sinnvoll, externe Hilfe zu erhalten. Das ist natürlich eine allgemeine Regel für das Teting: Lassen Sie immer jemanden testen, der nicht an der Herstellung des Dings beteiligt war.
Wenn wir das oben Gesagte als wahr akzeptieren, dann ist es wahrscheinlich, dass Leute, die Kaufentscheidungen treffen, "fähigen Sicherheitsmann" mit "findet viele Fehler" gleichsetzen. Diejenigen, die Computer dazu bringen, die Arbeit für sie zu erledigen, werden mehr Fehler finden als diejenigen, die dies nicht tun. Daher verlassen sie sich natürlich stark auf statische Analysetools und werden mehr Zeit damit verbringen, die Tools zu erweitern, als für bestimmte Probleme für bestimmte Kunden zu programmieren. Dann schließen wir, dass App-Sicherheitsleute eher Tools zum Lesen von Code schreiben als zum Lesen von Code.
** Warnung: Was bleibt, ist persönliche Meinung und Spekulation **
Die Realität ist gebrochen. Sie werden feststellen, dass es bei der Theorie der Software-Sicherheit darum ging, das Risiko zu identifizieren und auf das Risiko zu reagieren, sich auf ein Softwaresystem zu verlassen, während es in der Praxis darum ging, so viele Fehler wie möglich zu finden. Sicher, das reduziert das Risiko immer noch, aber nur als Nebeneffekt. Der Punkt des Spiels ist weniger wichtig als das "Gewinnen" des Spiels, daher werden die Regeln geändert, um das Gewinnen zu erleichtern.
Was können Sie als Softwareentwickler dagegen tun? Spielen Sie das Spiel nach den ursprünglichen Regeln. Finden Sie jemanden in Ihrem Team (vorzugsweise tatsächlich in Ihrem Team, anstatt einen Auftragnehmer, damit dieser motiviert ist, langfristige Ergebnisse zu erzielen, anstatt schnell zu gewinnen), der die Bedeutung der Sicherheit versteht und den Bejeezus aus ihnen heraus trainiert. Geben Sie dieser Person die Verantwortung, das Team anzuweisen, die zu Beginn meiner Antwort beschriebene End-to-End-Sicherheit bereitzustellen.
Außerdem geben Sie dieser Person die Autorität durch zu folgen . Wenn ein Design die Sicherheitsanforderungen nicht ausdrückt, muss er überarbeitet werden. Wenn die Implementierung die Sicherheitsanforderungen nicht erfüllt, darf sie nicht freigegeben werden . Ihre Sicherheitsperson kann das Urteil fällen, muss jedoch berechtigt sein, auf dieses Urteil zu reagieren. Mir ist klar, dass dies so klingt, als würde der Sicherheitsmann sagen "OMFG-Sicherheit ist das Wichtigste", aber das meine ich nicht. Wenn Ihr Produkt auch nicht die Anforderungen an Funktionalität, Benutzerfreundlichkeit oder Leistung erfüllt, sollten Sie dieses Produkt auch nicht freigeben.
Warum willst du das tun? Es sollte billiger sein: Wir haben alle die Code Complete-Tabelle gesehen (und wahrscheinlich für eine billige +10 Wiederholung angegeben), in der Fehler teurer werden, je später Sie sie beheben, oder? Nun, Sicherheitsmängel sind auch Mängel. Nach den realen Spielregeln sind die meisten Probleme bei den Anforderungen, die bei der Wartung behoben werden. Ist das billig
Ok, was kann ich als gemietete Sicherheitswaffe dagegen tun? Nun, es stellt sich heraus, dass ich mich auch weigern kann, nach den geänderten Regeln zu spielen. Ich kann Entwicklern sagen, dass es darum geht, das Risiko zu reduzieren, dass dies in jeder Phase möglich ist, und dann kann ich ihnen dabei helfen.