PHP-Redakteur Yuzai präsentiert Ihnen heute eine Java-Fragen-und-Antwort-Runde zur „Heap-Check“-Schwachstelle. Im Softwareentwicklungsprozess ist die Heap-Prüfung eine häufige Sicherheitslücke, die von Hackern leicht für böswillige Angriffe ausgenutzt werden kann. Durch das Q&A-Format dieses Artikels vermitteln wir Ihnen ein tiefgreifendes Verständnis der Definition, Prinzipien und Präventionsmethoden von Heap-Inspection-Schwachstellen und helfen Ihnen so, die Sicherheit Ihres Softwaresystems besser zu schützen.
Ich muss dem Anruf ein Passwort übergeben. Wenn ich das mache
byte[] datasourcepasswddecoded = base64.getdecoder().decode(datasourcepasswdencoded); string datasourcepasswd = new string(datasourcepasswddecoded); hikaridatasource.setpassword(datasourcepasswd);
Als Fortify diesen Code scannte, wurde gemeldet, dass der Code eine „Heap-Check“-Schwachstelle aufwies, die durch die Zuweisung von Passwörtern zu Zeichenfolgen verursacht wurde.
fortify wird sich nicht über den Originalcode beschweren:
hikaridatasource.setpassword(env.getproperty("spring.datasource.password"));
Auch wenn env.getproperty() einen String zurückgibt.
fortify empfiehlt:
private JPasswordField pf; ... final char[] password = pf.getPassword(); // use the password ... // erase when finished Arrays.fill(password, ' ');
Aber wie verwendet man char[] als Passwort, wenn die Funktion einen String erwartet?
Ja... Die Base64-Verschlüsselung des Passworts bietet überhaupt keinen Schutz. Jeder Hacker mit halber Intelligenz weiß, wie er Base64 identifiziert und entschlüsselt. Ihr „seltsames Base64-Zeug“ hilft also nicht weiter.
Aber andererseits hat Ihr Schwachstellenscanner auf ein Problem hingewiesen, das relativ schwer auszunutzen ist und wahrscheinlich sowieso nicht behoben werden kann.
Irgendwann in der Anwendung (in ihren Abhängigkeiten oder irgendwo) wird das Passwort in Java konvertiert. String
...因为某些 API 需要 String
。此时,无论扫描器是否告诉您,您都存在“堆检查”漏洞。例如,如果数据源使用 JDBC,则需要将该密码作为参数传递给 DriverManager.connect
调用。 connect
Es gibt drei Überladungen ... aber alle erfordern die Übergabe des Passworts als Klartextzeichenfolge. Die Lösung dieses Problems ist unpraktisch.
(Anscheinend funktioniert der sogenannte Fix, den Fortify vorgeschlagen hat, eindeutig nicht. Und es merkt nicht, dass Ihr Aufruf an setPassword(env.getProperty("spring.datasource.password"))
einfach nur „schlecht“ für das ist, was Sie gerade tun. Es geht um „Leistungssicherheit“. .)
Die praktischste Lösung besteht darin, dem Scanner mitzuteilen, dass es sich um ein „falsches Positiv“ handelt. Ergreifen Sie dann Maßnahmen, um zu verhindern, dass Hacker einen Debugger anschließen, RAM, Core-Dumps überprüfen, Festplatten austauschen usw. und den Heap nach einem String-Objekt durchsuchen, das möglicherweise ein Kennwort darstellt.
Es gibt auch eine „böse“ Lösung, die ein String
Zerkleinern über die Typabstraktion des -Objekts und das Überschreiben seines Hintergrundarrays erfordert. Aber dieser Ansatz ist fragil.
String
的表示形式在 Java 的生命周期中已更改多次,每次更改都可能会破坏您的 String
hat sich im Laufe der Lebensdauer von Java viele Male geändert, und jede Änderung kann Ihren String
的后备数组会与其他 String
In einigen Fällen wird das Backing-Array von String
可能已被复制或插入到其他 String
möglicherweise kopiert oder in ein anderes Objekt eingefügt wurde.
🎜 🎜Sofern es sich nicht um 🎜vertrauliche Informationen🎜 handelt, ist dies (meiner Meinung nach) übertrieben. Wenn Sie mit vertraulichen Informationen umgehen, sichern Sie bitte Ihre Plattform, bevor Sie diese Schritte unternehmen. (Und verlassen Sie sich bei Sicherheitsüberprüfungen nicht auf dumme Sicherheitsscansoftware!) 🎜Das obige ist der detaillierte Inhalt vonSicherheitslücke „Heap-Check'.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!