ترجمة آلية لم تُراجَع بعد. النص الإنجليزي هو المرجع في حال الاختلاف.
الملخص
في نواة Linux، تم حل الثغرة التالية: Bluetooth: L2CAP: رفض __l2cap_chan_add إذا كانت القناة تحتوي بالفعل على اتصال. قد يتم ربط l2cap_chan بـ l2cap_conn مرة واحدة على الأكثر. يُفترض هذا في عدة أماكن، مثل عملية تنظيف l2cap_chan_del. يوجد سباق من نوع TOCTOU يتم فيه انتهاك هذا الثابت: [Task 1] [Task 2] l2cap_chan_connect l2cap_sock_bind l2cap_chan_lock lock_sock l2cap_state_change if (sk->sk_state != BT_OPEN) chan->state = BT_CONNECT l2cap_sock_state_change_cb chan->state = BT_BOUND sk->sk_state = BT_BOUND lock_sock <------------------ release_sock sk->sk_state = BT_CONNECT. الدالة l2cap_sock_connect() لا تحقق من sk->sk_state، لذا وبما أن chan->state أصبح الآن BT_BOUND، فإن استدعاء connect() اللاحق ينتهي بـ __l2cap_chan_add ثانٍ. قم توثيق والتحقق من الثابت بوضوح في __l2cap_chan_add باستخدام WARN_ON_ONCE. موقع الاستدعاء الوحيد الذي يمكن الوصول إليه هو l2cap_chan_connect، لذا أضف فحصًا مسبقًا هناك لتجنب الاعتماد على chan->state. قراءة/كتابة chan->state غير محمية بشكل صحيح حاليًا، لذا يمكن أن تكون هناك مشاكل TOCTOUC أخرى. أضف l2cap_lock_chan في l2cap_sock_bind() لحماية كتابة chan->state.
المعالجة
المراجع
- مرجعhttps://git.kernel.org/stable/c/85cc289eb08afa975375f838187369e68b429ee0
- مرجعhttps://git.kernel.org/stable/c/820579652b24ce277e0097cd65b42bd9b7b8bf07
- مرجعhttps://git.kernel.org/stable/c/e618d928ec7f88cbeadfa3542adcac40f474e629
- مرجعhttps://git.kernel.org/stable/c/fabaff1c59ff2cc89cb7e5bd0186a5e15f0c73b2
- مرجعhttps://git.kernel.org/stable/c/52fe88e4ef87311eee32b45c65603e7c69e75e7d
- مرجعhttps://git.kernel.org/stable/c/10c705dd706aa93164ba41f2566f15206d6c178e
- مرجعhttps://git.kernel.org/stable/c/73820561d8cbfd3364a29b8fa77f1707f26029da
- مرجعhttps://git.kernel.org/stable/c/d3afd7803f9bc2a8c4270199497b60158b2fc647
- مرجعhttps://git.kernel.org/stable/c/86b55991d3cd690e73c5ef8d20b75ae4905b357a