Подмена пакетов
Разрешение имен в БД Oracle производится в следующей последовательности:
- Если имеется объект с таким названием в текущей схеме, то используется он
- Если имеется приватный синоним с таким названием в текущей схеме, то используется он.
- Если в БД имеется общедоступный синоним с таким названием, то используется он.
Описанная система имеет тот недостаток, что злоумышленник может произвести подмену пакетов, без ущерба для работоспособности объектов схемы. Для этого в текущей схеме создается новый пакет, с таким же именем, как и вызываемый (например, dbms_crypto), который делает некоторые дополнительные действия (например, вызов процедуры utl_http, utl_mail, utl_smtp и т.д.) а затем вызывает настоящий dbms_crypto. В результате пользователь может и не заметить подмены, компиляция всех объектов схемы будет происходить успешно, а пароли будут утекать в Интернет.
Пароли к схемам можно получить из файла логов http-web-access.log или путем включения трассировки
Бороться с подменой пакетом можно
- путем полной адресации объекта, например SQL > exec SYS.dbms_crypto …
- также путем отнимания привилегий на потенциально опасные пакеты UTL_MAIL, UTL_SMTP, UTL_TCP, UTL_HTTP, UTL_FILE, DBMS_RANDOM:
REVOKE EXECUTE ON UTL_SMTP FROM PUBLIC; REVOKE EXECUTE ON UTL_TCP FROM PUBLIC; REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC; REVOKE EXECUTE ON UTL_FILE FROM PUBLIC; REVOKE EXECUTE ON DBMS_RANDOM FROM PUBLIC;
Обнаружение потенциальных злоумышленников производится запросом:
SELECT * FROM DBA_TAB_PRIVS WHERE PRIVILEGE = 'EXECUTE' AND GRANTEE = 'PUBLIC' AND TABLE_NAME IN('UTL_SMTP','UTL_TCP','UTL_HTTP','DBMS_RANDOM') ;
SELECT GRANTEE AS USERNAME, PRIVILEGE, ADMIN_OPTION FROM DBA_SYS_PRIVS WHERE ( PRIVILEGE LIKE '% ANY %' OR PRIVILEGE LIKE '%DATABASE LINK%' OR PRIVILEGE LIKE '%UNLIMITED%' OR PRIVILEGE = 'BECOME USER' OR ADMIN_OPTION = 'YES' ) AND GRANTEE NOT IN ( 'SYS', 'SYSTEM', 'OUTLN', 'DBSNMP', 'DBA', 'CONNECT', 'RESOURCE', 'EXP_FULL_DATABASE', 'IMP_FULL_DATABASE', 'AQ_ADMINISTRATOR_ROLE', 'OEM_MONITOR', 'CTXSYS', 'IFSSYS', 'IFSSYS$CM', 'MDSYS', 'ORDPLUGINS', 'ORDSYS', 'TIMESERIES_DBA', 'WKSYS', 'SYSMAN', 'OLAPSYS', 'OLAP_DBA', 'EXFSYS', 'SCHEDULER_ADMIN', 'WMSYS', 'SI_INFORMTN_SCHEMA', 'JAVADEBUGPRIV', 'MDDATA', 'RECOVERY_CATALOG_OWNER' ) AND GRANTEE NOT IN ( SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS != 'OPEN' ) ORDER BY 1, 2 ;
А обнаружение потенциальных Троянов производится запросом: SELECT * FROM DBA_SYNONYMS WHERE OWNER = 'PUBLIC' AND NOT TABLE_OWNER IN ('SYS','SYSMAN','SYSTEM','WMSYS','EXFSYS','ORDSYS','MDSYS', 'XDB');