UTL_FILE_DIR安全弱点:为什么以及如何使用Oracle目录

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

  • 可以授予单个数据库帐户或角色对目录的读和/或写访问权限
  • 可以添加目录,而无需重新启动数据库
  • 在UTL_FILE.FOPEN语句中使用目录名,而不是在目录路径中使用目录名,这允许更改目录路径而无需修改PL / SQL源代码

保护UTL_FILE

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

Oracle通常假定PUBLIC具有对UTL_FILE的执行许可权,因此,许多Oracle产品安装并没有专门授予Oracle安装的数据库帐户对UTL_FILE的执行许可权。 因此,从PUBLIC撤消对UTL_FILE的执行许可将导致许多标准Oracle数据库实用程序和Oracle电子商务套件中的错误。 此外,某些Oracle产品和第三方产品将在产品安装期间将对UTL_FILE的执行授予PUBLIC。

我们不建议您在运行Oracle电子商务套件和其他复杂应用程序(例如SAP,Peoplesoft,Oracle Clinical等)的数据库实例中从PUBLIC撤消对UTL_FILE的执行许可,因为这可能会导致应用程序和第三者出错。派对产品. 仅在可以彻底测试应用程序,第三方产品和所有数据库管理工具的数据库实例中,从PUBLIC撤消执行许可。 所有Oracle交付的产品都必须经过测试,因为Oracle经常假定已将UTL_FILE授予PUBLIC,并且在安装任何产品时都不提供必要的授予-其中包括诸如Enterprise Manager Grid Control和Apex之类的产品。

通过从UTL_FILE_DIR中删除所有目录并改用目录功能,可以减轻UTL_FILE的安全性考虑。

Oracle电子商务套件和UTL_FILE_DIR

授予PUBLIC的UTL_FILE和可公开访问的UTL_FILE_DIR的组合为Oracle电子商务套件带来了重大的安全问题。 Oracle电子商务套件使用UTL_FILE_DIR读取和写入并发管理器请求临时文件。 而且,大多数组织广泛使用UTL_FILE_DIR从PL / SQL接口程序访问接口和转换数据文件。

在Oracle电子商务套件中,通常将UTL_FILE_DIR设置为至少包含$ APPLPTMP和$ APPLTMP中指定的目录-在默认安装中,它将至少包含“ / usr / tmp”。 通常,会为自定义界面和其他自定义程序包括其他自定义目录。

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

从UTL_FILE_DIR迁移

对于Oracle电子商务套件客户,根据接口和其他自定义程序的设计,从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可能有助于识别FOPEN语句中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电子商务套件目录($ APPLPTMP和$ APPLTMP),因为Oracle不支持此操作。 从理论上讲,它应该可以正常工作,但是,Oracle电子商务套件可以在多个位置引用目录,包括$ APPLPTMP和$ APPLTMP环境变量,系统配置文件选项(例如,“ ECX:XSLT File Path”)以及一些配置文件。

第二步–创建目录

若要将引用从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中删除所有自定义物理目录。 不应删除标准Oracle目录“ /usr/tmp”、“../comn/temp”等。 必须将数据库退回以使更改生效。

 

如有疑问,请通过以下方式与我们联系 [email protected]

参考文献

 Share this post

订阅RSS

将我们添加到您最喜欢的新闻阅读器中。

在Twitter上关注

获取最新更新。