Ich studiere für meine letzte Prüfung (yey!), Und bin auf ein Problem gestoßen, das mir schwer fällt herauszufinden. Es ist eine alte Prüfungsfrage, wo Sie mindestens zwei Sicherheitslücken finden sollten, die in einer Funktion ausgenutzt werden können, die eine ppm-Bilddatei liest. Das einzige Problem, das ich identifizieren kann, ist, wenn Spalten und/oder Zeilen unerwartete Werte erhalten, entweder zu groß (verursacht einen Integer-Überlauf) oder negativ, was dazu führt, dass im-> Raster eine falsche Größe hat, was die Möglichkeit eines Heap-basierten eröffnet Pufferüberlauf-Angriff.Sicherheitslücken in ziemlich einfachem c code
Soweit ich kann, sollte das ungeprüfte Malloc nicht ausnutzbar sein.
struct image *read_ppm(FILE *fp)
{
int version;
int rows, cols, maxval;
int pixBytes=0, rowBytes=0, rasterBytes;
uint8_t *p;
struct image *img;
/* Read the magic number from the file */
if ((fscanf(fp, " P%d ", &version) < 1) || (version != 6)) {
return NULL;
}
/* Read the image dimensions and color depth from the file */
if (fscanf(fp, " %d %d %d ", &cols, &rows, &maxval) < 3) {
return NULL;
}
/* Calculate some sizes */
pixBytes = (maxval > 255) ? 6 : 3; // Bytes per pixel
rowBytes = pixBytes * cols; // Bytes per row
rasterBytes = rowBytes * rows; // Bytes for the whole image
/* Allocate the image structure and initialize its fields */
img = malloc(sizeof(*img));
if (img == NULL) return NULL;
img->rows = rows;
img->cols = cols;
img->depth = (maxval > 255) ? 2 : 1;
img->raster = (void*)malloc(rasterBytes);
/* Get a pointer to the first pixel in the raster data. */
/* It is to this pointer that all image data will be written. */
p = img->raster;
/* Iterate over the rows in the file */
while (rows--) {
/* Iterate over the columns in the file */
cols = img->cols;
while (cols--) {
/* Try to read a single pixel from the file */
if (fread(p, pixBytes, 1, fp) < 1) {
/* If the read fails, free memory and return */
free(img->raster);
free(img);
return NULL;
}
/* Advance the pointer to the next location to which we
should read a single pixel. */
p += pixBytes;
}
}
/* Return the image */
return img;
}
Original (die letzte Frage): http://www.ida.liu.se/~TDDC90/exam/old/TDDC90%20TEN1%202009-12-22.pdf
Vielen Dank für jede Hilfe.
Dies erinnert mich an das (2008 gewinnende) Beispiel von [The Underhanded C Contest] (http://underhanded.xcott.com/), könnte einige Hinweise dort geben. –