如何防止从Postgres函数恶意返回数据?

时间:2017-06-13 15:59:33

标签: postgresql

我有一个可以执行功能的角色"聚合"用安全定义器设置。此函数的目的是允许执行另一个不受信任的函数,确保只允许从它返回两个整数。不受信任的函数是由用户临时编写的,它们必须是pgpsql函数。

为此,聚合函数执行以下操作:

  1. 根据参数p_indicator调用另一个函数。
  2. 确保p_indicator函数只返回两个数字。
  3. 返回两个数字。
  4. 如何确保被调用的子功能无法通过RETURN之外的其他方式向客户端发送行级数据。

    • 权限 - 我确保只有选择权限,以便子功能无法将数据插入或更新到其他表中以便以后检索。
    • 异常 - 我将整个函数包装在try-catch-other中,并返回一个通用异常,而不是一个可能包含数据的异常。

    我无法弄清楚:

    • 通知/调试 - 子功能可能包含RAISE NOTICE,它会将行级数据返回给客户端。我以为我可以通过设置client_min_messages来锁定它。但是,我遇到了两个主要问题:1。客户端可以在子函数中设置client_min_messages,覆盖我设置的内容。 2.客户可以使用神奇不受设置影响的RAISE INFO。

    • 还有什么? - 除了RAISE和RETURN之外,功能如何能够发送"数据给客户?

    我会说我通过在函数周围放置一个签名/验证过程来部分地解决了这个问题。也就是说,有人必须检查该功能,对其进行加密签名,然后在数据库中创建之前对已知公钥进行验证。但是,如果可能的话,我仍然希望保护聚合功能。

    我很高兴看到leak proof and security barrier个关键字;但是,这似乎只会影响观点。

1 个答案:

答案 0 :(得分:0)

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

虽然不太可能,攻击者也可以编写会触发后端崩溃的代码,并且可以在崩溃消息中将秘密信息泄露给客户端。如果攻击者可以访问服务器上的文件系统,甚至是临时空间,那么他们可能会开发出很多不同的漏洞。

还有一个事实是PL / pgSQL是一种图灵完备的语言,因此可以使用非常聪明的漏洞来创建隐蔽的通道。最终,只有你的“经过审计和签名”的功能方法才能获得成功,因为你无法在攻击者拥有整个编程语言资源的战斗中获胜,即使是那种原始编程语言也是如此。