2017-06-13 39 views
2

我有一個角色可以執行安全定義器設置的函數「聚合」。這個函數的目的是允許執行另一個不受信任的函數,確保只允許從它返回兩個整數。不受信任的函數是由用戶臨時編寫的,它們被要求是pgpsql函數。如何防止從Postgres功能惡意返回數據?

爲此,聚合函數執行以下操作:

  1. 調用另一個函數,按名稱,基於參數p_indicator。
  2. 確保只有兩個數字由p_indicator函數返回。
  3. 返回這兩個數字。

如何確保被調用的子功能沒有通過除RETURN之外的其他方式向客戶端發送行級別數據的方法。

  • 權限 - 我確保只有選擇權限到位,以便子功能不能插入或更新數據到其他表中以便以後檢索。
  • 異常 - 我將整個函數封裝在try-catch-other中,並返回一個通用異常,而不是可能包含數據的異常。

我一直無法弄清楚:

  • 聲明/調試 - 子功能可以包含加薪通知,將行級數據返回給客戶端。我認爲我可以通過設置client_min_messages來鎖定它。但是,我遇到了兩個主要問題:1.客戶端可以在子函數中設置client_min_messages,覆蓋我設置的內容。 2.客戶可以使用RAISE INFO,它神奇地不受設置的影響。

  • 還有什麼? - 除了RAISE和RETURN以外,函數如何將數據「發送」給客戶端?

我會說,我已經部分解決了這個問題,通過在函數中添加符號/驗證過程。也就是說,有人必須審查該函數,對其進行加密簽名,然後在數據庫中創建之前使用已知的公鑰對其進行驗證。但是,如果可能的話,我仍然想維護總體功能。

我很高興看到leak proof and security barrier關鍵字;然而,這似乎隻影響了觀點。

回答

0

您是正確的,目前無法可靠地阻止RAISE INFO和RAISE NOTICE。

儘管不太可能,攻擊者可能會編寫會觸發後端崩潰的代碼,並且祕密信息可能會在崩潰消息中泄露給客戶端。如果攻擊者可以訪問服務器上的文件系統,甚至是臨時空間,那麼他們可能會開發出不同的漏洞。

另外還有一個事實,即PL/pgSQL是一種圖靈完備的語言,因此可以創建非常聰明的漏洞來創建隱蔽通道。最終,只有你的「審覈和簽名」功能方法才能取得成功,因爲在攻擊者擁有可用的整個編程語言資源的戰鬥中,即使是那樣的原始資源,你也無法贏得勝利。