The island of Postgres
這裡是台灣 pgsql 的部落格,訴說有關於 PostgreSQL 的大小事。
CVE-2018-1058 描述了使用者如何在不同 schema 下建立類似名稱的物件,這些方式可以改變其他使用者查詢的行為並導致意外或惡意行為,也稱為「特洛伊木馬」攻擊。
↓
+++
例如:
SELECT * FROM table_a;
等同於
SELECT * FROM public.table_a;
↓
+++
CREATE TABLE alice.a AS SELECT 1::int AS id;
CREATE TABLE public.a AS SELECT 'a'::text AS id;
接下來如果 alice 執行:
SELECT * FROM a;
那麼她會得到:
id
----
1
也就是得到 alice.a 的內容。
關鍵在於「public」這個 schema,惡意的使用者可以利用 @fa[book]search_path 的設定,來改變其他使用者的行為。
↓ +++
假設有兩個使用者 alice 和 bob,使用同一個資料庫,也具備 public schema 建立的權限(一般預設的權限):
CREATE TABLE a (full_name varchar(255));
他們都可能可以使用下面語法來查詢,來取得小寫的字串結果:
SELECT lower(full_name) FROM a;
↓ +++
CREATE FUNCTION lower(varchar) RETURNS text AS $$
SELECT 'ALICE WAS HERE: ' || $1;
$$ LANGUAGE SQL IMMUTABLE;
而 bob 呼叫時:
SELECT lower(full_name) FROM a;
會發現 alice 成功地植入了「特洛伊木馬」!
↓ +++
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
這樣就可以避免你的資料庫遭遇 CVE-2018-1058 的風險了。
你可以從 psql 這樣來看看 public 有哪些東西:
\df public.*
↓
+++
ALTER ROLE username SET search_path = "$user";
讓使用者一定是先搜尋同名 schema 下的物件。
↓
+++
search_path = '"$user"'
預設值可能會有 public,你可以把它刪去。