Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Security/Bug: Null Pointer Dereference in cJSONUtils_strdup leads to Denial of Service (DoS)

Abierto
#1,048 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 12 días

@94xhn ya está trabajando en esto.

Desde el 10/7/2026.

  • #1053 de @94xhn — abierto

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
68/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Tranquilo
Stack tecnológico
c
Área
security

Línea de trabajo

Comienza en cJSON_Utils.c, en cJSONUtils_strdup y en la ruta apply_patch mostrada en el trace de ASan; compara su gestión de NULL con cJSON_strdup en cJSON.c. Compila y ejecuta el PoC proporcionado para un parche malformado con AddressSanitizer. Se considera terminado cuando la entrada NULL ya no se desreferencia y los llamadores como apply_patch o detach_path gestionan de forma segura un resultado NULL.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Issue Description:

A Null Pointer Dereference vulnerability exists in cJSON_Utils.c. The internal helper function cJSONUtils_strdup does not validate if the incoming pointer is NULL before passing it to strlen(). When processing a malformed JSON patch where critical string fields (like path) have a NULL value string, the application triggers a segmentation fault (Null Pointer Dereference), resulting in a Denial of Service (DoS).

Vulnerability Analysis:

The issue lies in cJSON_Utils.c:

static unsigned char* cJSONUtils_strdup(const unsigned char* const string)
{
    size_t length = 0;
    unsigned char *copy = NULL;

    // Vulnerability: No check for string == NULL before calling strlen()
    length = strlen((const char*)string) + sizeof(""); 
    ...
}
Root Cause:

Unlike cJSON_strdup in cJSON.c which checks if string is NULL, cJSONUtils_strdup completely lacks this safety guard.

When calling functions like cJSONUtils_ApplyPatches, if an attacker crafts a malicious patch object where the path or value item's valuestring is programmatically NULL or missing under certain edge cases, apply_patch() will eventually propagate this NULL pointer to cJSONUtils_strdup(). This results in strlen(NULL), leading to an immediate crash.

Steps to Reproduce
Proof of Concept (PoC)

Compile the following code with AddressSanitizer enabled (-fsanitize=address):

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include "cJSON_Utils.h"

int main(void)
{
    printf("[PoC 1] cJSONUtils_strdup NULL dereference\n");
    printf("[*] Constructing malformed patch with path->valuestring = NULL\n");

    /* Create target object: { "k": 1 } */
    cJSON *obj = cJSON_CreateObject();
    cJSON_AddNumberToObject(obj, "k", 1);

    /* Construct patch: { "op": "remove", "path": "/k" } */
    cJSON *patch = cJSON_CreateObject();
    cJSON *op = cJSON_CreateString("remove");
    cJSON *path = cJSON_CreateString("/k");

    /* Critical: Force path->valuestring to be NULL to simulate a malformed/corrupted item */
    path->valuestring = NULL;

    cJSON_AddItemToObject(patch, "op", op);
    cJSON_AddItemToObject(patch, "path", path);

    cJSON *patches = cJSON_CreateArray();
    cJSON_AddItemToArray(patches, patch);

    printf("[*] Calling cJSONUtils_ApplyPatches()...\n");
    
    /* Triggering vulnerability */
    cJSONUtils_ApplyPatches(obj, patches);

    cJSON_Delete(obj);
    cJSON_Delete(patches);
    return 0;
}
ASan Crash Log
==189825==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x55ff3336e33a bp 0x7ffd5b0f7c30 sp 0x7ffd5b0f7b70 T0)
==189825==The signal is caused by a READ memory access.
==189825==Hint: address points to the zero page.
    #0 0x55ff3336e33a in apply_patch /home/kali/Desktop/cjsson/cJSON_Utils.c:839
    #1 0x55ff3336ebd4 in cJSONUtils_ApplyPatches /home/kali/Desktop/cjsson/cJSON_Utils.c:1056
    #2 0x55ff333700f1 in main /home/kali/Desktop/cjsson/poc_1_strdup_null.c:60
Suggested Fix:

Align the behavior of cJSONUtils_strdup with cJSON_strdup by adding a NULL pointer check at the beginning of the function:

static unsigned char* cJSONUtils_strdup(const unsigned char* const string)
{
    size_t length = 0;
    unsigned char *copy = NULL;

    if (string == NULL)
    {
        return NULL;
    }

    length = strlen((const char*)string) + sizeof("");
    ...

Additionally, upstream callers (like apply_patch or detach_path) should properly handle cases where cJSONUtils_strdup returns NULL.

Lenguaje dominante
C
Estrellas
13k
Forks
3.5k
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de DaveGamble/cJSON

Todos los issues de DaveGamble/cJSON

Issues similares

Más issues de C

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.