প্রযুক্তি ও উদ্ভাবন

PostgreSQL-এর ১২ বছরের ফাঁক—backup account থেকেই server দখল সম্ভব

|লেখক: QUASA সম্পাদকীয় দল|5 মিনিটের পাঠ| 2
PostgreSQL-এর ১২ বছরের ফাঁক—backup account থেকেই server দখল সম্ভব

Cyera Research ১ সেপ্টেম্বর ২০২৬-এ PostGREShell নামে CVE-2026-6471-এর প্রযুক্তিগত বিশ্লেষণ প্রকাশ করেছে; PostgreSQL প্রকল্প এর patch দিয়েছিল ১৩ আগস্ট। PostgreSQL-এর CVE নথি অনুযায়ী, logical decoding-এর authorization ত্রুটি REPLICATION privilege-ধারী non-superuser-কে server-এর operating-system account দেখতে পায় এমন library load করে সেই account-এর অধিকারেই arbitrary code চালানোর সুযোগ দিত।

এটি password ছাড়াই যেকোনো PostgreSQL server আক্রমণের ত্রুটি নয়। আক্রমণকারীর REPLICATION-সক্ষম বৈধ credential, logical decoding ব্যবহারের সুযোগ এবং malicious library-টি server-এর কাছে পৌঁছানোর উপায় দরকার; তবে শর্তগুলো মিললে backup বা replication account থেকে database host নিয়ন্ত্রণ এবং PostgreSQL superuser অধিকার অর্জন সম্ভব। Cyera Research-এর বিশ্লেষণ ত্রুটিপূর্ণ পথটি ২০১৪ সালে PostgreSQL 9.4-এ logical decoding আসার সময় থেকে থাকার কথা জানিয়েছে এবং proof of concept-এ code execution, privilege escalation ও restart-সহনশীল persistence দেখিয়েছে।

কোন instance-এ exploit-এর শর্ত মেলে

PostgreSQL cluster-এ REPLICATION role, logical wal_level ও logical replication slot একসঙ্গে সক্রিয়

Version inventory ঝুঁকি নির্ধারণের প্রথম ধাপ, কিন্তু vulnerable release চললেই প্রতিটি instance একইভাবে exploitable হয় না। এই পথে এমন একটি login দরকার যার REPLICATION attribute রয়েছে; logical decoding চালাতে server-এ সাধারণত wal_level = logical থাকতে হয়। এরপর replication client একটি logical slot তৈরির সময় output plugin হিসেবে এমন library নির্দেশ করে, যা PostgreSQL backend load করতে পারে।

তাই title-এর ‘backup account’ বলতে প্রতিটি backup credential বোঝায় না। Physical backup, standby, CDC connector, migration tool বা WAL-পড়া monitoring integration-এর role-এ REPLICATION থাকতে পারে, আবার কোনো backup role-এ তা নাও থাকতে পারে। ঝুঁকির আসল সীমা নির্ধারণ করবে role attribute, logical-decoding configuration, network access এবং server-visible library path—account-এর নাম নয়।

Logical replication এখন ব্যবহার না হলেও পুরোনো slot, অসমাপ্ত migration বা সাময়িকভাবে দেওয়া REPLICATION attribute exposure রেখে যেতে পারে। pg_hba.conf যদি বিস্তৃত address range থেকে replication connection নেয়, অথবা একই credential একাধিক system-এ সংরক্ষিত থাকে, credential চুরি হওয়ার পর exploit path-এ পৌঁছানো সহজ হয়; তবে এগুলো patch-এর প্রয়োজন বদলায় না।

Logical decoding কীভাবে privilege boundary ভেঙেছে

Logical replication slot-এর output plugin হলো compiled shared library, যা পরিবর্তনের stream কোন format-এ বের হবে তা নির্ধারণ করে। PostgreSQL library-টি নিজের backend process-এ load করে; ফলে তার code database server চালানো operating-system account-এর অধিকার পায়।

সাধারণ SQL LOAD পথে non-superuser-এর library path সীমিত করার পরীক্ষা ছিল। কিন্তু replication protocol দিয়ে plugin বেছে নেওয়ার পথে সেই restriction প্রয়োগ করা হয়নি: quoted plugin name-এ path separator, traversal sequence বা পূর্ণ path পৌঁছে যেতে পারত library loader পর্যন্ত। Server process-এর কাছে library-টি দৃশ্যমান হলে সেটি load হয়ে arbitrary code চালাতে পারত।

Library পৌঁছানোর উপায় platform-ভেদে আলাদা। Windows server outbound SMB share-এ পৌঁছাতে পারলে remote DLL load করা যায়; NFS automount-সক্ষম Linux বা macOS-এ network path ব্যবহার করা সম্ভব। সাধারণ Linux, container বা Kubernetes deployment-এ আক্রমণকারীর আগে থেকেই server-visible স্থানে malicious shared library লেখার আলাদা পথ দরকার—তাই vulnerable version মানেই সব পরিবেশে সমান remote exploitability নয়।

Code একবার PostgreSQL process-এর মধ্যে চললে SQL permission আর কার্যকর নিরাপত্তা-সীমা থাকে না। প্রদর্শিত exploit catalog সরাসরি বদলে replication role-কে superuser করেছে এবং configuration ও preload mechanism ব্যবহার করে restart-এর পরেও access রেখেছে। এটি সম্ভাব্য প্রভাবের demonstration; অস্বাভাবিক slot বা plugin error একা সফল exploitation-এর প্রমাণ নয়।

কোন branch-এ কোন fixed version

PostgreSQL-এর পাঁচ supported branch fixed release-এ যাচ্ছে এবং non-default plugin অনুমতি যাচাই হচ্ছে

Supported upstream branch-এর ন্যূনতম fixed release হলো:

  • PostgreSQL 18: 18.6;
  • PostgreSQL 17: 17.11;
  • PostgreSQL 16: 16.15;
  • PostgreSQL 15: 15.19;
  • PostgreSQL 14: 14.24।

Patch-এর সঙ্গে output_plugin_libraries setting এসেছে; default অনুমোদিত plugin হলো pgoutput ও test_decoding। The Hacker News-এর ৪ সেপ্টেম্বরের যাচাই অনুযায়ী, wal2json বা decoderbufs-এর মতো অন্য plugin ব্যবহারকারী installation-এ update-এর পর সংশ্লিষ্ট নাম allowlist-এ না দেওয়া পর্যন্ত logical decoding প্রত্যাখ্যাত হবে; একই প্রতিবেদনের সময় Amazon RDS-এ পাঁচটি supported branch-এর fixed package পাওয়া যাচ্ছিল।

Unsupported major version-এর নিরাপত্তা এই তালিকা থেকে অনুমান করা যাবে না। পুরোনো deployment-কে supported branch-এ নিতে হবে, অথবা operating-system distribution বা service provider CVE-টির নির্দিষ্ট backport দিয়েছে কি না যাচাই করতে হবে। Vendor package-এ আলাদা suffix বা version scheme থাকতে পারে, তাই শুধু PostgreSQL major number দেখে patch status স্থির করা যথেষ্ট নয়।

চার স্তরের exposure checklist

PostgreSQL exposure audit-এ version, REPLICATION role, logical plugin ও managed-service patch status যাচাই

১. Version inventory: primary, replica, disaster-recovery node, CI database এবং বন্ধ থাকা deployable image-সহ সব instance-এর চলমান server version ও package source নথিবদ্ধ করুন। Image বা manifest আপডেট হলেও পুরোনো process চলতে পারে; তাই rollout ও প্রয়োজনীয় restart সম্পন্ন হয়েছে কি না মিলিয়ে দেখুন।

২. REPLICATION role inventory: প্রতিটি cluster-এর pg_roles-এ rolreplication সক্রিয় role শনাক্ত করুন। Role-টির workload, credential কোথায় রাখা আছে, কোন address থেকে connection অনুমোদিত এবং privilege এখনও প্রয়োজন কি না দেখুন। অপ্রয়োজনীয় attribute সরানো, credential rotate করা ও pg_hba.conf সংকুচিত করা exposure কমায়, কিন্তু vulnerable binary patch করার বিকল্প নয়।

৩. Logical-decoding inventory: wal_level, pg_replication_slots-এর logical slot এবং প্রতিটি slot-এর plugin পরীক্ষা করুন। Non-default plugin থাকলে update-এর আগে নতুন allowlist-এ তার প্রয়োজন ও compatibility ঠিক করুন; তা না হলে বৈধ CDC বা migration pipeline থেমে যেতে পারে। অপ্রত্যাশিত source address, অচেনা slot, path-সদৃশ plugin name এবং library-load error তদন্তের জন্য server log সংরক্ষণ করুন।

৪. Managed-service patch status: console-এ শুধু ‘automatic maintenance’ দেখা যথেষ্ট নয়। চলমান engine-এর কার্যকর build, maintenance completion এবং replica বা read-pool একই patched build-এ আছে কি না provider-এর release note বা CVE advisory দিয়ে মিলিয়ে নিন। Self-hosted পরিবেশে package ও restart সরাসরি দলের নিয়ন্ত্রণে; managed service patch-এর সময় provider ঠিক করলেও role, credential ও logical-slot audit গ্রাহকের দায়িত্বে থাকতে পারে।

বর্তমানে vulnerability এবং supported branch-এর fixed releases নিশ্চিত; account থেকে code execution-এর পথও গবেষণায় প্রদর্শিত। কিন্তু কোনো নির্দিষ্ট organization আক্রান্ত হয়েছে কি না, তা version দেখে বলা যায় না। সিদ্ধান্তের ভিত্তি তাই চারটি আলাদা তথ্য: চলমান build fixed কি না, কোন role REPLICATION বহন করছে, logical decoding ও কোন plugin সক্রিয়, এবং provider বাস্তবে patch rollout শেষ করেছে কি না।

আরও পড়ুন:

শেয়ার করুন:

আমাদের নিউজলেটার নিন

সর্বশেষ Web3, AI ও ক্রিপ্টো সংবাদ সরাসরি আপনার ইনবক্সে পান।

0