دليل عملي

PgBouncer 1.26.1: إصلاح CVE-2026-107350 (SCRAM)

الأمان والمراقبة12 دقيقةً للقراءةعدد الخطوات: 14

في 14 أكتوبر 2026 أصلح PgBouncer 1.26.1 ثغرة تجاوز مصادقة SCRAM برقم CVE-2026-107350، إضافة إلى ثغرتَي حجب خدمة. وكانت حزم الإصدارات المستقرة من Debian لا تزال مصنفة معرّضة للثغرة وقت الفحص، لذا لا يحسم الأمر أمر `apt upgrade` وحده. قد يحدث ألا يعرف المرء أي إصدار من PgBouncer يعمل على خادمه، ولا من يستطيع الوصول إلى منفذه. يقدّم هذا الدليل الأوامر اللازمة لمعرفة الإصدار في دقائق، والتحديث بحسب طريقة التثبيت (مستودع PGDG أو RHEL أو Docker أو الشيفرة المصدرية)، وتدابير التخفيف في الأثناء، ثم فحص السجلات.

المحتويات· ما الذي يصلحه PgBouncer 1.26.11/13
  1. 01ما الذي يصلحه PgBouncer 1.26.1
  2. 02الإصدارات المتأثرة وحالة الحزم
  3. 03«PgBouncer لديّ غير مكشوف»: معيار غير كافٍ
  4. 04ما الذي يحدد انكشافك الفعلي
  5. 05التحقق من الإصدار والانكشاف في دقائق
  6. 06أي مسار للتحديث: حالة حزم Debian
  7. 07التحديث بحسب طريقة التثبيت
  8. 08إعادة التشغيل دون قطع العملاء، وحالة search_path
  9. 09التخفيف إلى حين تطبيق الإصلاح
  10. 10فحص آثار اتصال منتحَل
  11. 11إغلاق الملف: من الإصدار إلى المتابعة
  12. 12على VPS خاص بك، الرافعات الثلاث بيدك
  13. 13الوثائق الرسمية

ما الذي يصلحه PgBouncer 1.26.1

في 14 أكتوبر 2026 نشر مشروع PgBouncer الإصدار 1.26.1 الذي يصلح ثلاث ثغرات. أخطرها CVE-2026-107350، وهي تجاوز للمصادقة: يستطيع عميل يعرف كلمة مرور مستخدم SCRAM واحد أن يسجّل الدخول بصفة أي مستخدم SCRAM آخر، بما في ذلك مديرو PgBouncer والمستخدمون ذوو الصلاحيات الكاملة في PostgreSQL. وتعود الآلية إلى رسالة بدء ثانية، هي StartupMessage، تُعالَج أثناء مصادقة SCRAM عندما يستهدف الاتصال قاعدة بيانات غير موجودة. وبحسب وصف Mend، يظل تبادل SCRAM مُتحقَّقًا منه بمفاتيح المستخدم الأول، بينما تُفتح الجلسة بهوية المستخدم الثاني. ويوضح سجل التغييرات أن الهجوم يشترط SCRAM لدى المستخدمين معًا.

أما الثغرتان الأخريان فهما حجب خدمة يمكن إطلاقهما دون مصادقة، لكن في ظل خيارات إعداد معينة فقط: CVE-2026-107349 وCVE-2026-107348. وتمنح Mend للثغرة CVE-2026-107350 درجة CVSS v4 قدرها 8.7. والدرجة أقل أهمية من سؤال عملي: أي إصدار يعمل لديك، ومن يستطيع بلوغ المنفذ 6432؟

الإصدارات المتأثرة وحالة الحزم

مرّر الجدول أفقيًا

الحالةالوضعالإجراء
PgBouncer من 1.17.0 إلى 1.26.0متأثر بـ CVE-2026-107350 إذا كان الحسابان يستخدمان SCRAMالترقية إلى 1.26.1
PgBouncer من 1.20.0 إلى 1.26.0متأثر بـ CVE-2026-107349 إذا كان `ignore_startup_parameters` غير فارغ ولا يتضمن `options`الترقية إلى 1.26.1
PgBouncer من 1.21.0 إلى 1.26.0متأثر بـ CVE-2026-107348 فقط إذا تجاوز `max_packet_size` القيمة 2147483648الترقية إلى 1.26.1
Debian bookworm، الحزمة 1.18.0-1+deb12u1مصنّفة معرّضة للثغرة في متتبّع أمان Debianمستودع PGDG أو البناء من المصدر
Debian trixie، الحزمة 1.24.1-1+deb13u2مصنّفة معرّضة للثغرة في متتبّع أمان Debianمستودع PGDG أو البناء من المصدر
Debian forky وsid، الحزمة 1.26.1-1مُصلَحةالتحديث عبر apt
صورة Docker من طرف ثالثتتوقف على الإصدار المضمَّنفحص `pgbouncer -V` داخل الحاوية
إصدار أقدم من 1.17.0خارج النطاق المعلن لـ CVE-2026-107350لا تكتفِ بذلك، وخطّط للتحديث

«PgBouncer لديّ غير مكشوف»: معيار غير كافٍ

الاعتراض وجيه: PgBouncer الذي يستمع على عنوان خاص فقط لا يمكن بلوغه من الإنترنت. لكن الهجوم لا يحتاج إلى تخمين بالقوة الغاشمة، إذ يكفي معرفة كلمة مرور مستخدم SCRAM صالح واحد والقدرة على بلوغ المنفذ. وكلمة مرور التطبيق تعيش في ملف .env أو متغير في CI أو جهاز مطوّر، وأحيانًا في سجل. والتطبيق المخترَق يوفّر كلمة المرور والموقع الشبكي معًا. ومن هناك تحوّل الثغرة حسابًا تطبيقيًا محدودًا إلى حساب إداري، بل إلى مستخدم بصلاحيات كاملة على خادم PostgreSQL الذي خلفه.

فالمعيار الحاسم إذن ليس «إنترنت أم لا»، بل سؤالان: من يستطيع فتح اتصال بالمنفذ 6432، وكم كلمة مرور صالحة متداولة. إصدار معرّض للثغرة خلف جدار حماية صارم خطر مخفَّض، لا خطر مزال.

ما الذي يحدد انكشافك الفعلي

  • عنوان الاستماع — لا توجد قيمة افتراضية لـ listen_addr: بدونه يقبل PgBouncer مقابس Unix فقط. والقيمة * تفتح كل الواجهات.
  • نوع المصادقة — يشترط الهجوم SCRAM لدى المستخدمين معًا. راجع auth_type وطبيعة السجلات في الملف الذي يحدده auth_file.
  • عدد الحسابات — كل كلمة مرور صالحة بوابة نحو بقية حسابات SCRAM. عشرة حسابات تطبيقية تعني عشرة مفاتيح للباب نفسه.
  • حسابات الإدارة — يفتح admin_users الوصول إلى وحدة التحكم، وقد يكون الدور المستخدم للوصول إلى PostgreSQL مستخدمًا بصلاحيات كاملة.
  • Docker وجدار الحماية — المنفذ الذي ينشره Docker يمر بقواعده الشبكية الخاصة التي كثيرًا ما تتجاوز قواعد ufw. تحقق من طريقة نشر المنفذ، لا من جدار الحماية وحده.
  • الخيارات المرتبطة بحجب الخدمة — ignore_startup_parameters غير فارغ دون options، أو max_packet_size مرفوع فوق قيمته الافتراضية.
  • الحاويات والحزم المضمَّنة — يحتفظ PgBouncer المسلَّم داخل حزمة Compose أو chart بإصدار صورته، أيًّا كان إصدار الخادم المضيف.

التحقق من الإصدار والانكشاف في دقائق

  1. استعلم من وحدة تحكم الإدارة

    psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW VERSION;"
    لا يستطيع الاتصال إلا مستخدمو admin_users أو stats_users. يعرض الأمر SHOW VERSION سلسلة إصدار PgBouncer: وبعد الإصلاح يجب أن تذكر 1.26.1.

  2. اقرأ إصدار الملف التنفيذي

    pgbouncer -V
    which -a pgbouncer
    قد تتجاور ملفات تنفيذية عدة، ملف الحزمة وآخر تحت /usr/local بعد بناء من المصدر. وليس الأول في القائمة دائمًا هو ما تشغّله الخدمة.

  3. اقرأ إصدار الحزمة

    Debian وUbuntu:
    dpkg -l pgbouncer
    apt-cache policy pgbouncer
    RHEL وAlmaLinux وRocky:
    rpm -q pgbouncer
    dnf info pgbouncer
    قارن مع الجدول أعلاه. قد تتلقى حزمة التوزيعة إصلاحًا دون تغيير رقم الإصدار الأصلي: ثق بمتتبّع أمان التوزيعة أكثر من الرقم وحده.

  4. أعد قراءة الإعداد المحمَّل فعلًا

    ps -eo pid,args | grep '[p]gbouncer'
    grep -nE '^(listen_addr|listen_port|auth_type|auth_file|admin_users|ignore_startup_parameters|max_packet_size)' /etc/pgbouncer/pgbouncer.ini
    ملف .ini الواجب قراءته هو الممرَّر وسيطًا إلى العملية، وليس بالضرورة المسار المعتاد.

  5. اعرف من يستطيع بلوغ المنفذ

    sudo ss -ltnp | grep 6432
    sudo ufw status numbered
    nc -vz <server_ip> 6432
    يبيّن الأمر الأخير، إذا شُغّل من جهاز آخر، هل يستجيب المنفذ خارج الشبكة المقصودة. والاستجابة غير المتوقعة تستوجب قرارًا فوريًا بشأن جدار الحماية.

  6. أحصِ حسابات SCRAM دون عرض الأسرار

    grep -c 'SCRAM-SHA-256' /etc/pgbouncer/userlist.txt
    استبدل المسار بمسار auth_file. لا تلصق محتوى الملف في تذكرة أو محادثة: فهو يحوي بصمات كلمات مرورك.

  7. جرّد الحاويات

    docker ps
    docker port <container>
    docker exec <container> pgbouncer -V
    تحتفظ الحاوية العاملة بالصورة التي بدأت بها. وتبيّن نتيجة docker port هل المنفذ منشور على المضيف.

أي مسار للتحديث: حالة حزم Debian

وقت كتابة هذا الدليل، يصنّف متتبّع أمان Debian الإصدارين bookworm (1.18.0-1+deb12u1) وtrixie (1.24.1-1+deb13u2) معرّضين للثغرة CVE-2026-107350، ولا يملك الحزمة المصلَحة 1.26.1-1 سوى forky وsid. وما دامت Debian لم تنشر إصلاحًا لإصدارك، فإن apt upgrade وحده لا يحميك. أعد مراجعة المتتبّع يوم تنفيذك: فقد تتغير الحالة.

ثمة ثلاثة مسارات. الأول: مستودع PGDG، أي apt.postgresql.org لـ Debian وUbuntu وyum.postgresql.org لـ RHEL ومشتقاته، وتصفه صفحة تنزيل PgBouncer بأنه بناءات قد تكون أحدث من تلك الموجودة في التوزيعات. الثاني: صورة Docker أو وسم محدَّث، مع العلم أن المشروع لا يذكر أي صورة رسمية، فأنت إذن تستخدم صورة من طرف ثالث. الثالث: بناء أرشيف الشيفرة المصدرية للإصدار 1.26.1. وقبل التحويل، تأكد عبر apt-cache policy pgbouncer أو dnf info pgbouncer أن المستودع يعرض فعلًا الإصدار المصلَح.

التحديث بحسب طريقة التثبيت

  1. انسخ الإعداد احتياطيًا

    sudo cp -a /etc/pgbouncer /root/pgbouncer-etc-backup
    تتيح هذه النسخة الرجوع إذا استبدل التحديث ملفًا ما. دوّن أيضًا الإصدار الحالي قبل البدء.

  2. Debian وUbuntu: فعّل مستودع PGDG

    sudo apt install -y postgresql-common ca-certificates
    sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
    apt-cache policy pgbouncer
    يُعدّ السكربت الرسمي مستودع apt.postgresql.org. ويجب أن يعرض الأمر الأخير مرشحًا بالإصدار 1.26.1؛ وإن غاب فلا تتابع بهذا المسار.

  3. Debian وUbuntu: التثبيت

    sudo apt update
    sudo apt install --only-upgrade pgbouncer
    pgbouncer -V
    إذا اقترح dpkg استبدال ملف الإعداد لديك فأبقِ نسختك المحلية. ويؤكد pgbouncer -V الملف التنفيذي المثبَّت.

  4. RHEL وAlmaLinux وRocky

    أضف مستودع PGDG بالأوامر التي يولّدها محدِّد yum.postgresql.org لتوزيعتك، ثم:
    sudo dnf makecache
    dnf info pgbouncer
    sudo dnf upgrade pgbouncer
    تأكد أن الإصدار المقترح هو 1.26.1 قبل التأكيد.

  5. Docker وCompose

    docker compose pull pgbouncer
    docker compose up -d pgbouncer
    docker compose exec pgbouncer pgbouncer -V
    إذا كانت الصورة مثبّتة على وسم أو digest قديم فحدّث هذا المرجع أولًا في ملف Compose. وإن لم يوجد وسم 1.26.1 فابنِ الصورة من الشيفرة المصدرية.

  6. البناء من الشيفرة المصدرية

    curl -LO https://www.pgbouncer.org/downloads/files/1.26.1/pgbouncer-1.26.1.tar.gz
    sha256sum pgbouncer-1.26.1.tar.gz
    قارن المجموع الناتج بالمنشور في صفحة التنزيل قبل المتابعة.
    tar xzf pgbouncer-1.26.1.tar.gz
    cd pgbouncer-1.26.1
    ./configure --prefix=/usr/local
    make
    sudo make install
    يتطلب البناء libevent 2.0 أو أحدث وOpenSSL 1.0.1 أو أحدث ومترجم C11. وتوصي الوثائق باستخدام Autoconf في الإنتاج.

  7. أعد التشغيل ثم تحقق

    sudo systemctl restart pgbouncer
    ps -o lstart= -p $(pgrep -o pgbouncer)
    sudo readlink -f /proc/$(pgrep -o pgbouncer)/exe
    لا تكفي إعادة التحميل: يجب أن تنطلق العملية من جديد بالملف التنفيذي الجديد. ويثبت ذلك وقت البدء ومسار الملف التنفيذي. وأخيرًا شغّل SHOW VERSION من جديد في وحدة التحكم.

إعادة التشغيل دون قطع العملاء، وحالة search_path

تقطع إعادة التشغيل الاتصالات المفتوحة. وتصف الوثائق بديلًا: عمليات عدة على المنفذ نفسه عبر so_reuseport، ثم SHUTDOWN WAIT_FOR_CLIENTS على عملية واحدة في كل مرة بينما يعيد العملاء الاتصال. ونقطة انتباه أخرى: منذ الإصدار 1.26.0 يُتتبَّع search_path افتراضيًا، ويجعل 1.26.1 الخيار ignore_startup_parameters يتقدم على المعاملات المتتبَّعة. فإذا كان تطبيق يرسل search_path عند البدء وكنت تعتمد على تجاهله، فأضف ignore_startup_parameters = search_path إلى الإعداد لاستعادة سلوك الإصدار 1.25.

التخفيف إلى حين تطبيق الإصلاح

بالنسبة إلى CVE-2026-107350 لا يقدّم الإعلان أي تخفيف عبر الإعداد: التحديث هو الجواب الحقيقي الوحيد. لكن يمكنك تقليص عدد من يحاول. قيّد المنفذ 6432 بشبكة التطبيقات:
sudo ufw allow from <app_subnet> to any port 6432 proto tcp
sudo ufw status numbered
sudo ufw delete <n>
يمثل <n> هنا رقم قاعدة أوسع موجودة أصلًا، كفتح المنفذ 6432 للجميع، وتُحذف بعد وضع القاعدة المقيِّدة. وفي RHEL ومشتقاته تُضبط القاعدة نفسها عبر firewalld. وإذا كانت قيمة listen_addr هي * فاستبدلها بالعنوان الخاص للخادم. ثم دقّق ملف auth_file: احذف الحسابات غير المستخدمة، وبدّل كلمات المرور التي تداولها الناس، وقلّص admin_users إلى الحد الأدنى الضروري.

أما ثغرتا حجب الخدمة فما يلي قراءتنا لشروط سجل التغييرات، وليس توجيهًا من الناشر. تفترض CVE-2026-107349 أن ignore_startup_parameters غير فارغ ولا يتضمن options: وإضافة options إلى القائمة تزيل الشرط؛ وإفراغ الإعداد يزيله أيضًا، لكنه قد يتسبب في رفض العملاء الذين يرسلون معاملات بدء (انظر حالة search_path أعلاه). وتفترض CVE-2026-107348 أن max_packet_size أعلى من 2147483648: والإبقاء على القيمة الافتراضية 2147483647 يستبعدها.

فحص آثار اتصال منتحَل

يسجّل PgBouncer افتراضيًا الاتصالات الناجحة وحالات قطع الاتصال مع أسبابها، بفضل log_connections وlog_disconnections. اقرأ الفترة التي تلي نشر الإصلاحات، وما قبلها إن سمحت سجلاتك:
sudo journalctl -u pgbouncer --since "2026-10-14"
ابحث عن محاولات نحو أسماء قواعد بيانات غير موجودة في قسم [databases] لديك، تليها مباشرة جلسة تُفتح باسم مستخدم مختلف من العنوان نفسه. وفي وحدة التحكم يعرض هذان الأمران الحالة الراهنة:
psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW DATABASES;"
psql -h 127.0.0.1 -p 6432 -U <admin_user> pgbouncer -c "SHOW CLIENTS;"
ومن جهة PostgreSQL اعرض الأدوار وتغييراتها الأخيرة بالأمر psql -c "\du".

لا نملك توقيعًا دقيقًا لهذا الهجوم في السجلات، ولا نختلقه. وغياب الآثار لا يثبت غياب الاختراق، خاصة إذا كان log_connections معطّلًا أو دُوّرت السجلات. وعند شك جدي، غيّر كلمات مرور جميع حسابات SCRAM والأدوار ذات الامتيازات في خادم PostgreSQL.

إغلاق الملف: من الإصدار إلى المتابعة

التحديث الناجح يُثبَت ولا يُفترَض. لكل خادم، دوّن في جدول الجهاز وطريقة التثبيت والإصدار قبل التحديث وبعده وقاعدة جدار الحماية المطبقة وتاريخ الفحص. تحقق أن SHOW VERSION يعلن 1.26.1، وأن العملية أُعيد تشغيلها بعد التثبيت، وأن المنفذ 6432 لا يُبلَغ إلا من الشبكة المقصودة. وتأكد كذلك أن إعدادَي حجب الخدمة يحترمان الشروط الموصوفة أعلاه، أو أنهما لم يعودا ذا موضوع.

وأخيرًا لا تعوّل على التحديثات التلقائية: فحزمة التوزيعة غير المصلَحة لا تُحدّث نفسها، وكذلك صورة Docker المثبّتة. أضف تذكيرًا لإعادة مراجعة متتبّع أمان توزيعتك، ثم انتقل إلى حزمتها متى أُصلحت، أو أبقِ مستودع PGDG عن قصد.

على VPS خاص بك، الرافعات الثلاث بيدك

يتطلب إصلاح PgBouncer ثلاثة أنواع من الوصول: اختيار الإصدار المثبَّت، وضبط جدار حماية المنفذ 6432، وقراءة السجلات. وعلى VPS Cloud بصلاحية root تكون هذه الرافعات الثلاث بيدك، دون انتظار جدول مضيف مشترك. وتفصّل الأدلة المرتبطة أسفل هذا المقال جدار الحماية وإعداد PostgreSQL. هذا الدليل مقدَّم دون دعم فني: يبقى التحديث على عاتقك. وإن فضّلت تفويض إدارة الخادم فثمة خيار إدارة VPS، يُقدَّر بحسب حاجتك.

الوثائق الرسمية

إعلان الإصدار 1.26.1: https://www.postgresql.org/about/news/pgbouncer-1261-released-fixes-three-cves-3403/

سجل تغييرات PgBouncer: https://www.pgbouncer.org/changelog.html

تنزيلات PgBouncer: https://www.pgbouncer.org/downloads/

الاستخدام ووحدة تحكم الإدارة: https://www.pgbouncer.org/usage.html

إعداد PgBouncer: https://www.pgbouncer.org/config.html

متتبّع أمان Debian لـ CVE-2026-107350: https://security-tracker.debian.org/tracker/CVE-2026-107350

بطاقة Mend لـ CVE-2026-107350: https://www.mend.io/vulnerability-database/CVE-2026-107350/

مستودع apt لـ PostgreSQL: https://wiki.postgresql.org/wiki/Apt

مستودع yum لـ PostgreSQL: https://yum.postgresql.org/

Docker وجدران الحماية: https://docs.docker.com/engine/network/packet-filtering-firewalls/

خادم تتحكم أنت في إصداره وجدار حمايته

على VPS Cloud بصلاحية root تختار إصدار PgBouncer، وتغلق المنفذ 6432 إلا أمام الأجهزة المقصودة، وتقرأ سجلاتك بنفسك. ويتيح خيار إدارة VPS تفويض هذه المتابعة.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة