Почему перемещение mutex_unlock () после dev_kfree_skb () может устранить ошибку use-after-free? - PullRequest
0 голосов
/ 28 октября 2019

Недавно я обнаружил статью под названием «Эффективный статический анализ ошибок параллельного использования после освобождения в драйверах устройств Linux». Он использует мотивирующий пример (это также патч для ядра: https://github.com/torvalds/linux/commit/4f68ef64cd7f). Я исследую связанный исходный код ядра, я обнаружил, что функция dev_kfree_skb (frame.skb) сначала уменьшит user_count в frame.skb, если user_count == 0, структура frame.skb будет действительно освобождена. Однако операция чтения в другой функции сначала попытается получить frame.skb, что увеличит use_count. Поэтому, я думаю, даже без этого патча ядра памятьframe.skb не будет освобожден до операции чтения. Я не знаю, действительно ли необходим этот патч для ядра.

int cw1200_hw_scan(...) { 
  ......
  mutex_lock(&priv->conf_mutex); 
  ......
  mutex_unlock(&priv->conf_mutex);
  if (frame.skb)
    dev_kfree_skb(frame.skb); // FREE 
  ......
}


void cw1200_bss_info_changed(...) { 
  ......
  mutex_lock(&priv->conf_mutex); 
  ......
  cw1200_upload_beacon(...); // read frame.skb in this function
  ......
  mutex_unlock(&priv->conf_mutex); 
  ......
}
...