CVE-2024-35907 in Linuxinformation

Résumé

par VulDB • 02/06/2026

Dans le contexte du pilote `mlxbf_gige` (Gigabit Ethernet pour les processeurs Mellanox BlueField), l'erreur décrite est un **Kernel Panic** causé par une condition de course (race condition) lors de l'ouverture de l'interface réseau.

### Analyse du problème

1. **Cause racine** : * L'interruption RX (réception) est **déjà active** ou **pending** (en attente) avant que `request_irq()` ne soit appelé pour l'enregistrer. * Dès que `request_irq()` termine, le gestionnaire d'interruption (IRQ handler) est appelé immédiatement. * Le gestionnaire d'interruption essaie d'accéder à des structures de données (comme les buffers de réception, les descripteurs, etc.) qui **ne sont pas encore initialisées** ou dont les ressources ne sont pas encore allouées, car l'initialisation complète du pilote (`mlxbf_gige_open`) n'est pas terminée.

2. **Trace d'appels** : * `mlxbf_gige_open` appelle `mlxbf_gige_request_irqs`. * `request_irq` enregistre le gestionnaire. * Une interruption RX pendante est déclenchée. * Le gestionnaire d'interruption (`mlxbf_gige_rx_irq` ou similaire) s'exécute. * Il tente d'accéder à des ressources non prêtes → **Oops/Fatal exception**.

### Solution

La solution consiste à **désactiver les interruptions RX** avant d'appeler `request_irq()`, puis à les réactiver **après** que toutes les ressources nécessaires (comme les buffers de réception) soient correctement initialisées.

Voici comment corriger le code dans `mlxbf_gige_open` (ou la fonction associée) :

#### Étapes de correction :

1. **Avant** `request_irq()` pour l'interruption RX : * S'assurer que les interruptions RX sont **désactivées** au niveau du matériel (ou du contrôleur d'interruptions). Cela empêche toute interruption pendante de déclencher le handler immédiatement après l'enregistrement.

2. **Après** `request_irq()` et **après** l'initialisation complète des ressources RX (comme l'allocation des buffers, la configuration des descripteurs, etc.) : * Réactiver les interruptions RX.

#### Exemple de code corrigé (pseudo-code) :

```c static int mlxbf_gige_open(struct net_device *ndev) {
struct mlxbf_gige *gige = netdev_priv(ndev); int ret;

// ... autres initialisations ...

// 1. Désactiver explicitement les interruptions RX avant de les enregistrer // Cela empêche les interruptions pendantes de déclencher le handler // avant que les ressources ne soient prêtes. mlxbf_gige_disable_rx_irq(gige);

// 2. Enregistrer les interruptions ret = request_irq(gige->rx_irq, mlxbf_gige_rx_irq_handler, 0, ndev->name, ndev); if (ret) {
netdev_err(ndev, "Failed to request RX IRQ\n"); return ret; }

// 3. Initialiser les ressources RX (buffers, descripteurs, etc.) ret = mlxbf_gige_init_rx_resources(gige); if (ret) {
free_irq(gige->rx_irq, ndev); return ret; }

// 4. Réactiver les interruptions RX SEULEMENT après que tout est prêt mlxbf_gige_enable_rx_irq(gige);

// ... autres initialisations ...

return 0; } ```

### Points clés à vérifier dans le code existant :

1. **Fonctions `mlxbf_gige_enable_rx_irq()` et `mlxbf_gige_disable_rx_irq()`** : * Assurez-vous que ces fonctions existent et contrôlent correctement les bits d'interruption dans les registres du contrôleur Ethernet. * Si elles n'existent pas, vous devrez écrire du code pour écrire dans les registres appropriés (par exemple, le registre `INT_MASK` ou similaire).

2. **État initial des interruptions** : * Vérifiez si les interruptions RX sont activées par défaut au démarrage. Si oui, il est crucial de les désactiver explicitement au début de `mlxbf_gige_open()`.

3. **Autres interruptions

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Réserver

17/05/2024

Divulgation

19/05/2024

Modérer

accepté

Entrée

VDB-265161

CPE

prêt

EPSS

0.00229

KEV

non

Activités

très faible

Sources

Might our Artificial Intelligence support you?

Check our Alexa App!