Wie Länge des empfangenen Byte-Array zu validieren, die nicht null beendet wird?
-
25-09-2019 - |
Frage
Ich habe eine C \ C ++ Code, der eine Struktur über das Netzwerk empfängt, von dieser Form:
struct DataStruct
{
int DataLen;
BYTE* Data;
}
Der Code I läuft über Data
in einer Schleife von DataLen
Zeiten und verarbeitet die Daten.
... Das Problem:
Nachdem der Code auf Sicherheitsexperten für Penetrationstests kam, bereitete sie eine gefälschte Anwendung, die diese Struktur mit DataLen
sendet größer als die tatsächliche Länge von Data
. Dies bewirkt natürlich eine Zugriffsverletzung Ausnahme.
Also, die Frage ist - wie kann ich die tatsächliche Länge des empfangenen Data
validieren? Ist es möglich, ohne die Struktur zu ändern?
Vielen Dank im Voraus.
Lösung
Nizza Sicherheitsexperten! Ich möchte meine Firma eine Abteilung wie das hatte.
Jedes Mal, wenn Daten aus dem Netz empfangen wird, meldet das Netzwerk IO die Anzahl der Bytes in den Puffer tatsächlich geschrieben, ob Sie verwendet read(2)
, recv(2)
oder boost::asio::async_read
oder irgendetwas anderes habe ich gesehen. Typischer Anwendungsfall, wenn es eine „Anzahl von Bytes zu folgen“ Feld in der Kopfzeile Ihrer Datenstruktur, ist immer wieder zu lesen Anruf / recv / etc, bis dass viele Bytes empfangen wurden (oder bis Fehler aufgetreten ist), und erst dann sollte es konstruieren und das Rück Ihre DataStruct (oder Fehler melden).
Andere Tipps
Sie wissen, wie viel Bytes, die Sie erhalten haben, so vergleichen nur mit DataLen
.
Es ist unmöglich, ohne die Struktur zu verändern. Daten von TCP / IP-Socket empfangen ist klar Strom. Logischerweise ist es nicht in Pakete aufgeteilt. Physikalisches Paket kann eine oder mehrere DataStruct Instanzen enthält, kann man DataStruct Beispiel auf zwei oder mehr physikalischen Pakete aufgeteilt werden. Aktuelle Informationsstruktur kann nur verwendet werden, wenn es keine Kommunikationsfehler oder ungültige Pakete sind.
Die Korruption ist einfach, wenn Sie keine intrinsische Einschränkung.
Einige Schutzmechanismen wären:
- Versuchen Sie, den Puffer, innerhalb einer akzeptablen Größe
realloc()
(wennData
dynamisch ist) - Ausnahmen sind Freunde: Verwendung
SIGSEGV
insignal(2)
,signal(7)
undsetjmp(2)
einige nützliche try / catch Code-Struktur zu tun. Siehe Kombination setjmp () / longjmp ( ) und Signal für eine schnelle Einführung zu diesem Thema Umgang mit . Verwendensigaction(2)
tiefer zu gehen (durch die fehlerhafte Adresse bekommen;).