Fragen? Antworten! Siehe auch: Alternativlos
Normalerweise kopiert man in C Strings mit strcpy, aber das weiß nicht, wie lang der Buffer ist, und kann daher nichts prüfen. Wenn man einen zu langen String kopiert, kann ein Angreifer damit die Anwendung übernehmen und Ransomware installieren.
C hat auch noch eine andere Funktion zum String-Kopieren, strncpy. Dem gibt man eine Länge, aber das eröffnet direkt die nächste Lücke. Wenn man einen zu langen String kopiert, überschreibt der zwar nichts hinter dem Bufferende, aber er fügt auch kein terminierendes Nullbyte ein. Das führt dann bei der nächsten Verwendung des Buffers zu Fehlern, wenn auch erstmal "nur" Lesefehlern. Kann aber immer noch die Anwendung crashen.
strlcpy ist ähnlich strncpy, aber garantiert ein Nullbyte. Ausnahme: Wenn man eine Bufferlänge 0 übergibt.
Ist damit jetzt alles gut? Nein. Abgeschnittene Strings sind vielleicht keine Speicherkorruption, aber können ebenfalls ein Sicherheitsproblem darstellen. Z.B. wenn ein Angreifer es schafft, in einer Logzeile am Anfang lauter Müll einzufügen, und damit am Ende seine IP abzuschneiden, die dann nicht im Log steht.
Und es bleibt die Frage, was man tun soll, wenn jemand strlcpy mit Länge 0 aufruft. Oder strlcat und es ist kein 0-Terminator im Zielpuffer.
Am Ende kommt man mit solchen Quick Fixes vielleicht dem Ziel etwas näher, aber es nimmt einem doch nicht die Pflicht, ordentlichen Code zu schreiben, und alle Eventualitäten zu beachten.
Dennoch. Die Funktionen sind aus dem letzten Jahrtausend, und glibc war die letzte große Unix-Implementation, die das nicht hatte. Das war schon irgendwie ein bisschen peinlich, weil es halt eher nach einer Trotzreaktion als nach einem inhaltlichen Argument aussah.