CVE-2025-68776 in Linux
Riassunto
di VulDB • 21/06/2026
Nel kernel Linux, la funzione `__pskb_copy()` restituisce un puntatore all'`sk_buff` copiato. Se l'allocazione della memoria fallisce, questa funzione restituisce `NULL` (o più precisamente, un puntatore errato che deve essere controllato tramite `IS_ERR_OR_NULL` o semplicemente `NULL` a seconda della versione del kernel e della specifica implementazione, ma nel contesto di `hsr_forward.c` e delle best practices moderne, il controllo per `NULL` è cruciale se la funzione può fallire in modo non-errore, oppure si usa `IS_ERR`).
Tuttavia, guardando la firma di `__pskb_copy` nei kernel recenti, essa restituisce `struct sk_buff *` e restituisce `NULL` in caso di fallimento dell'allocazione.
Ecco il codice patchato con il controllo NULL aggiunto immediatamente dopo la chiamata a `__pskb_copy()` nella funzione `hsr_forward_do` (o dove viene utilizzata, tipicamente in `hsr_forward.c`):
```c #include <linux/skbuff.h> #include <linux/hsr.h>
/* ... altre definizioni ... */
static void hsr_forward_do(struct hsr_node *node, struct sk_buff *skb, int port) {
struct sk_buff *skb2; int err;
/* ... codice precedente ... */
/* Copia dello sk_buff per l'invio */ skb2 = __pskb_copy(skb, skb_headroom(skb), GFP_ATOMIC); if (!skb2) {
/* Gestione elegante del fallimento di allocazione */ kfree_skb(skb); return; }
/* ... resto del codice ... */ } ```
### Spiegazione: 1. **Chiamata a `__pskb_copy()`**: Questa funzione crea una copia dello `sk_buff`. Se la memoria non può essere allocata, restituisce `NULL`. 2. **Controllo NULL**: Se `skb2` è `NULL`, significa che l'allocazione è fallita. Invece di procedere con un puntatore nullo (che causerebbe un kernel panic o un use-after-free), si libera lo sk_buff originale (`kfree_skb(skb)`) e si esce dalla funzione. 3. **Gestione Graceful**: Questo evita crash del kernel e gestisce il fallimento in modo sicuro, rilasciando le risorse appropriate.
> **Nota**: In alcune versioni del kernel, `__pskb_copy` potrebbe restituire un puntatore errato (`ERR_PTR`) invece di `NULL`. In tal caso, si dovrebbe usare `IS_ERR(skb2)` invece di `!skb2`. Tuttavia, la richiesta specifica di aggiungere un controllo NULL, quindi la soluzione sopra è conforme. Se si desidera essere più robusti, si può usare: > ```c > if (IS_ERR_OR_NULL(skb2)) {
> kfree_skb(skb); > return; > } > ```
If you want to get best quality of vulnerability data, you may have to visit VulDB.