Utl_file_dir安全弱点:为什么和如何使用Oracle目录

UTL_FILE_DIR是数据库初始化参数Oracle数据库用于确定在使用标准UTL_FILE数据库包时可以读取或写入的操作系统目录和文件PL / SQL软件包,功能和过程。 任何数据库用户都可以访问UTL_FILE_DIR参数中指定的目录,任何数据库用户都可以是安全问题。 在Oracle 9ir2中,Oracle发布了名为“目录”的新功能,该功能提供了更安全和强大的能力来访问操作系统目录和文件。 使用OVER OVER UTL_FILE_DIR的优点是 -

  • 可以授予对目录的读取和/或写入访问权限到各个数据库帐户或角色
  • 可以添加一个目录而无需反弹数据库
  • 目录名称用于UTL_FILE.FOPEN语句而不是目录路径,允许更改目录路径而不修改PL / SQL源代码

安全utl_file.

UTL_FILE数据库包用于读取和写入操作系统目录和文件。  默认情况下,Public授予UTL_FILE上的执行权限。因此,任何数据库帐户都可以从UTL_FILE_DIR数据库初始化参数中指定的目录中读取和写入文件。

Oracle通常假设公众在UTL_FILE上执行权限,因此,许多Oracle产品安装没有特别授予UTL_FILE上的执行权限到Oracle已安装的数据库帐户。 因此,撤消来自公共utl_file的执行权限将导致许多标准Oracle数据库实用程序和Oracle电子商务套件中的错误。 此外,在安装产品期间,一些Oracle产品和第三方产品将在UTL_FILE上授予EXECUTE。

我们不建议在运行Oracle E-Business Suite和其他复杂应用程序(即SAP,PeopleSoft,Oracle临床等)的数据库实例中撤销UTL_FILE的执行权限,因为可能遇到应用程序中的错误和第三个党产品. 只能在应用程序,第三方产品和所有数据库管理工具都可以彻底测试数据库实例中公开的撤销权限。 必须测试所有Oracle提供的产品,因为Oracle经常假设UTL_File被授予公众,并且在安装任何产品时不提供必要的赠款 - 这包括企业管理器网格控制和顶点等产品。

可以通过从UTL_FILE_DIR中删除所有目录并使用目录功能来缓解具有UTL_FILE的安全注意事项。

Oracle E-Business Suite和UTL_FILE_DIR

ull_file被授予的public和utl_file_dir被公开访问的组合为Oracle E-Business Suite创建了一个重要的安全问题。 Oracle E-Business Suite使用UTL_FILE_DIR来读写并发管理器请求临时文件。 此外,大多数组织广泛使用UTL_FILE_DIR来从PL / SQL接口程序访问接口和转换数据文件。

在Oracle E-Business Suite中,UTL_FILE_DIR通常设置为至少包含$ applptmp和$ appltmp中指定的目录 - 在默认安装中,这将包括至少“/ usr / tmp”。 通常,将包含其他自定义目录以用于自定义接口和其他自定义程序。

通过访问ApplsySpub数据库帐户,攻击者可以轻松读写界面数据文件。 根据确切的配置,实现的模块和自定义接口,这可以允许访问敏感信息,包括社会安全号码和信用卡号。

从UTL_FILE_DIR迁移

对于Oracle E-Business Suite客户,从UTL_FILE_DIR迁移到目录只需要最小的更改,并且可能不需要根据接口和其他自定义程序的设计更改源代码。这些步骤如下 -

  1. 识别使用util_file的位置
  2. 创建目录
  3. 更改Fopen呼叫使用目录
  4. 编辑UTL_FILE_DIR以删除物理目录

步骤一 - 识别使用util_file的位置

最困难的问题是使用UTL_FILE_DIR中的物理目录标识包,函数和过程。 UTL_FILE_DIR物理目录仅由UTL_FILE.FOPEN函数直接引用。 Fopen指定要打开的操作系统目录和文件名。 所有后续的读取,写入和关闭函数调用使用Fopen返回的文件句柄。

以下SQL可以帮助识别upen语句中UTL_FILE_DIR的用途 -

SELECT * FROM dba_source 

WHERE upper(text) like '%FOPEN%' 

AND name like '%<custom prefix>%' 

AND owner = 'APPS' 

 如果对Fopen的调用不在共同函数并且无法通过其他一些间接访问,则应在任何自定义PL / SQL包,功能和程序中找到并更改必要的Fopen引用应该相当简单。 如果物理目录路径存储在表中或在并发程序定义中,则不需要更改源代码。

此时,不建议将标准转换为Oracle E-Business Suite目录($ applptmp和$ appltmp),因为Oracle不支持这一点。 从理论上它应该在没有任何问题的情况下工作,但是,Oracle E-Business Suite在包括$ applptmp和$ appltmp环境变量,系统配置文件选项(例如,“ECX:XSLT文件路径”)中的多个位置中的目录引用目录(例如,“ECX:XSLT文件路径”)。某些配置文件。

第二步 - 创建目录

需要以下常规步骤来将UTL_FILE_DIR的引用更改为目录。请注意目录名称 必须 始终在所有UTL_FILE.FOPEN语句中大写大写,否则可能会遇到错误

对于UTL_FILE_DIR中的每个自定义目录,请在每个开发,测试和生产数据库实例中执行以下SQL语句 -

 
CREATE OR REPLACE DIRECTORY <name> AS '<physical directory path>'; 
GRANT READ, WRITE ON DIRECTORY <name> TO APPS;            

举个例子 -

CREATE OR REPLACE DIRECTORY TMP_DIR AS '/usr/tmp'; 
GRANT READ, WRITE ON DIRECTORY TMP_DIR TO APPS; 

 

目录“/ usr / tmp”和“../comn/temp”和$ applptmp和$ appltmp中的任何其他目录都应留在Utl_file_dir中,因为Oracle需要这些目录。

第三步 - 更改Fopen呼叫使用目录

一旦创建了目录,下一步是编辑代码以使用它们。这个过程很简单。如果在utl_file.fopen语句中指定了物理目录,请将硬编码路径更改为目录名称。 

举个例子 -

FILE_ID := UTL_FILE.FOPEN('/usr/tmp', 'dummy.txt', 'W'); 

 change to –

FILE_ID := UTL_FILE.FOPEN('TMP_DIR', 'dummy.txt', 'W'); 

 两个指针记住:

  1. 始终务必使用大写的目录名称,它必须用单引号括起来 
  2. 如果在表中指定了物理目录或并发程序定义中的参数,则只需指定目录名称而不是物理路径 - / usr / tmp变为tmp_dir

第四步 - 编辑UTL_FILE_DIR删除物理目录

从UTL_FILE_DIR中删除所有自定义物理目录。 不应删除“/ usr / tmp”,'../comn/temp'等的标准Oracle目录。 必须反弹数据库以实现更改以生效。

 

如果您有疑问,请联系我们 [email protected]

参考

 Share this post

订阅RSS.

将我们添加到您最喜欢的新闻读者。

在推特上关注

获取最新的更新。