CVE-2022-49771 in Linux
要約
〜によって VulDB • 2026年07月13日
Linuxカーネルにおいて、以下の脆弱性が修正されました。
dm ioctl: モジュール読み込みとの競合時に発生する誤動作の修正
__list_versionsはまず、「dm_target_iterate(list_version_get_needed, &needed)」呼び出しを使用して必要なスペースを見積もり、次に「dm_target_iterate(list_version_get_info, &iter_info)」呼び出しを使用してそのスペースにデータを埋めます。これらの各呼び出しでは、「down_read(&_lock)」および「up_read(&_lock)」呼び出しを用いてターゲットがロックされます。しかし、最初の「dm_target_iterate」と2番目の「dm_target_iterate」の間にはロックが保持されず、この時点でターゲットモジュールを読み込むことができるため、2番目の「dm_target_iterate」呼び出しは、最初の「dm_target_iterate」で返された値よりも多くのスペースを必要とする可能性があります。
コードはこのオーバーフローの処理を試みていますが(list_version_get_infoの冒頭参照)、その処理が正しくありません。
コードでは、「param->data_size = param->data_start + needed」と「iter_info.end = (char *)vers+len」が設定されます。「needed」は最初のdm_target_iterate呼び出しで返されたサイズであり、「len」はユーザー空間によって割り当てられたバッファのサイズです。
「len」が「needed」より大きい場合があります。この場合、コードは最大「len」バイトをバッファに書き込みますが、param->data_sizeは「needed」に設定されているため、param->data_sizeの値を超えてデータを書き込む可能性があります。ioctlインターフェースはユーザー空間へparam->data_sizeまでのみコピーするため、結果の一部が切り捨てられます。
このバグを修正するために、「iter_info.end = (char *)vers + needed;」を設定します。これにより、2番目の「dm_target_iterate」呼び出しが「needed」バッファまでしか書き込まないことが保証され、もし「needed」スペースを超えてオーバーフローした場合は「DM_BUFFER_FULL_FLAG」で終了します。この場合、ユーザー空間はより大きなバッファを割り当てて再試行します。
なお、list_version_get_neededにもバグがあります。「strlen(tt->name)」ではなく、「strlen(tt->name) + 1」を必要なサイズに追加する必要があります。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.