pREST (PostgreSQL REST) یک API است که یک برنامه را روی پایگاه داده Postgres ارائه میدهد. در نسخههای قبل از 2.0.0-rc3، امکان بروز حمله SQL Injection وجود دارد. اعتبارسنجی موجود در این نسخهها محافظت کافی در برابر تلاشهای تزریق را فراهم نمیکند.
با فرض اینکه درخواست فقط ستونهای id و task خواسته شود، کوئری تولید شده مانند کوئری زیر خواهد بود:
SELECT "id", "task" FROM
تابع SelectSQL مقادیر پایگاه داده، شِما و جدول را مستقیماً از درخواست دریافت کرده و از آنها برای ساخت بخش بعدی عبارت SQL با استفاده از اتصال سادهی رشتهها استفاده میکند.
query := config.PrestConf.Adapter.SelectSQL(selectStr, database, schema, table)
// ...
func (adapter *Postgres) SelectSQL(selectStr string, database string, schema string, table string) string {
return fmt.Sprintf(`%s "%s"."%s"."%s"`, selectStr, database, schema, table)
}
اگر فرض کنیم که درخواست GET به مسیر زیر ارسال شود:
/db001/api/todos/db001/api/todos
کوئری نهایی چیزی شبیه به این خواهد بود:
SELECT "id", "name" FROM "api"."todos"
این مرحله پردازشی روی مقادیر، بهویژه شِما و جدول، انجام میدهد که هیچ گونه اعتبارسنجی ورودی روی آنها صورت نمیگیرد و در نهایت امکان تزریق SQL را فراهم میکند.
محصولات آسیبپذیر
نسخههای قبل از 2.0.0-rc3
توصیههای امنیتی
به کاربران توصیه میشود در صورت استفاده از این نوع API، آن را به نسخه 2.0.0-rc3 به روزرسانی نمایند.
منبع خبر
https://nvd.nist.gov/vuln/detail/CVE-2025-58450
https://github.com/prest/prest/security/advisories/GHSA-p46v-f2x8-qp98
- 26
