ما الذي يصلحه 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 بإصدار صورته، أيًّا كان إصدار الخادم المضيف.
التحقق من الإصدار والانكشاف في دقائق
استعلم من وحدة تحكم الإدارة
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.اقرأ إصدار الملف التنفيذي
pgbouncer -Vwhich -a pgbouncer
قد تتجاور ملفات تنفيذية عدة، ملف الحزمة وآخر تحت/usr/localبعد بناء من المصدر. وليس الأول في القائمة دائمًا هو ما تشغّله الخدمة.اقرأ إصدار الحزمة
Debian وUbuntu:
dpkg -l pgbouncerapt-cache policy pgbouncer
RHEL وAlmaLinux وRocky:rpm -q pgbouncerdnf info pgbouncer
قارن مع الجدول أعلاه. قد تتلقى حزمة التوزيعة إصلاحًا دون تغيير رقم الإصدار الأصلي: ثق بمتتبّع أمان التوزيعة أكثر من الرقم وحده.أعد قراءة الإعداد المحمَّل فعلًا
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الواجب قراءته هو الممرَّر وسيطًا إلى العملية، وليس بالضرورة المسار المعتاد.اعرف من يستطيع بلوغ المنفذ
sudo ss -ltnp | grep 6432sudo ufw status numberednc -vz <server_ip> 6432
يبيّن الأمر الأخير، إذا شُغّل من جهاز آخر، هل يستجيب المنفذ خارج الشبكة المقصودة. والاستجابة غير المتوقعة تستوجب قرارًا فوريًا بشأن جدار الحماية.أحصِ حسابات SCRAM دون عرض الأسرار
grep -c 'SCRAM-SHA-256' /etc/pgbouncer/userlist.txt
استبدل المسار بمسارauth_file. لا تلصق محتوى الملف في تذكرة أو محادثة: فهو يحوي بصمات كلمات مرورك.جرّد الحاويات
docker psdocker 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 أن المستودع يعرض فعلًا الإصدار المصلَح.
التحديث بحسب طريقة التثبيت
انسخ الإعداد احتياطيًا
sudo cp -a /etc/pgbouncer /root/pgbouncer-etc-backup
تتيح هذه النسخة الرجوع إذا استبدل التحديث ملفًا ما. دوّن أيضًا الإصدار الحالي قبل البدء.Debian وUbuntu: فعّل مستودع PGDG
sudo apt install -y postgresql-common ca-certificatessudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.shapt-cache policy pgbouncer
يُعدّ السكربت الرسمي مستودع apt.postgresql.org. ويجب أن يعرض الأمر الأخير مرشحًا بالإصدار 1.26.1؛ وإن غاب فلا تتابع بهذا المسار.Debian وUbuntu: التثبيت
sudo apt updatesudo apt install --only-upgrade pgbouncerpgbouncer -V
إذا اقترح dpkg استبدال ملف الإعداد لديك فأبقِ نسختك المحلية. ويؤكدpgbouncer -Vالملف التنفيذي المثبَّت.RHEL وAlmaLinux وRocky
أضف مستودع PGDG بالأوامر التي يولّدها محدِّد yum.postgresql.org لتوزيعتك، ثم:
sudo dnf makecachednf info pgbouncersudo dnf upgrade pgbouncer
تأكد أن الإصدار المقترح هو 1.26.1 قبل التأكيد.Docker وCompose
docker compose pull pgbouncerdocker compose up -d pgbouncerdocker compose exec pgbouncer pgbouncer -V
إذا كانت الصورة مثبّتة على وسم أو digest قديم فحدّث هذا المرجع أولًا في ملف Compose. وإن لم يوجد وسم 1.26.1 فابنِ الصورة من الشيفرة المصدرية.البناء من الشيفرة المصدرية
curl -LO https://www.pgbouncer.org/downloads/files/1.26.1/pgbouncer-1.26.1.tar.gzsha256sum pgbouncer-1.26.1.tar.gz
قارن المجموع الناتج بالمنشور في صفحة التنزيل قبل المتابعة.tar xzf pgbouncer-1.26.1.tar.gzcd pgbouncer-1.26.1./configure --prefix=/usr/localmakesudo make install
يتطلب البناء libevent 2.0 أو أحدث وOpenSSL 1.0.1 أو أحدث ومترجم C11. وتوصي الوثائق باستخدام Autoconf في الإنتاج.أعد التشغيل ثم تحقق
sudo systemctl restart pgbouncerps -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 tcpsudo ufw status numberedsudo 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/