快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

CVE-2016-1238(第二部分(

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

欢迎回到我们关于PostreSQL、PL/PerlU的讨论,避免把自己写在角落里。 上一次,我们讨论了PostreSQL中用户定义函数的一些基础知识。 现在,我们正在观察它们会在哪里引起问题。

什么让你陷入麻烦?

要在PL/PerlU代码中利用漏洞,必须发生几件事:

  1. 要么必须存在以前的漏洞,将文件写入一种数据库系统数据目录,要么必须更改目录。
  2. 更改目录后,必须在攻击者具有写权限的目录中加载易受攻击的模块。

第一次发生在你背后是可能的,尽管不太可能。 但是人们总是问我如何从数据库后端发送电子邮件,所以你不能总是保证人们在思考他们行为的后果。

因此,当人们用战术思维和无纪律的方式编码时,漏洞就会出现。 这在任何地方都是真的,但是这里的问题特别微妙,它们既危险又罕见。

攻击场景

因此,假设公司A通过一个X12格式的匿名文件传输协议下拉框接收到一个文本文件(具体的格式并不相关,只是它带有由外部用户指定的内容和文件名). 像X12这样复杂的格式意味着他们很难自己解析,所以他们在一种数据库系统中实现了一个模块加载器。 模块加载器对文件句柄的操作如下。

导入时,模块加载程序将目录更改为传入目录。 在对get_handle的实际调用中,它打开一个文件句柄,并基于它创建一个迭代器,然后返回它。 没有人注意到目录没有被改回来,因为这是然后加载到数据库,没有其他文件访问在这里完成。 我已经看到这种规模的设计问题在很长一段时间内都没有被发现,所以编写防御性代码意味着假设它们会存在。

现在,接下来,在数据库中这样重新实现:


现在,在现实世界中发布的模块中,这可能会导致问题,但是在公司的内部运营中,它可能不会及时地提出发现的问题。

公司配置的相关部分是:

现在,如果一个补充配置。下午被加载到与文本文件相同的目录中,它将作为PL/PerlU函数的一部分被加载和运行。

现在要利用这一点,了解系统的人必须把它放在那个目录中。 可能是内部人员未能正确保护入站网服务。 可能是外部的某个有内幕消息的人(比如前雇员)。 或者,可以基于其他共享模块可能具有共享依赖性来尝试更标准的利用。

实现这一目标所需的内部知识水平很高,但其后果实际上相当可怕。 当加载时,Perl模块与数据库交互,与函数的其余部分具有相同的权限,但是它也具有作为数据库服务器的文件系统访问权限。 这意味着它可以执行以下任一操作:

  1. 编写Perl模块,在程序制导数据目录的其他上下文中利用此漏洞。
  2. 删除或损坏数据库文件。
  3. 可能会根据安装更改日志文件。
  4. 许多其他非常糟糕的事情。

这些风险是使用不受信任的语言所固有的,您可能会编写易受攻击的代码并将安全问题引入数据库。 这就是一个例子,我认为一种数据库系统团队在保证平台安全方面做得非常好。

防止问题的规范编码

遵循一些基本规则可以有效地防止危险:

PL/PerlU中所有用户定义的函数和存储过程都应该包含以下行:

模块可能会在您的背后添加这个,但是对于已发布的模块,这是极不可能的。 所以本地开发项目不应该使用lib。为了防止这种情况。

其次, 从不 在PL/Perl函数中使用chdir . 请记住,您始终可以使用绝对路径进行文件操作。 没有chdir,就不可能通过PL/PerlU对当前工作目录进行初始攻击。 chdir的使用规避了一种数据库系统中的重要安全保护。

第三,坚持维护良好的模块很重要。 当许多其他人正在使用一个模块时,模块的加载逻辑中的悬空chdir更有可能被发现和修复,悬空chdir几乎是意外漏洞的必备条件。 对于内部模块,它们需要在模块加载逻辑中检查可选依赖项的使用和悬挂chdir .

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638