Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
De forma predeterminada, los desencadenadores DML y DDL se ejecutan en el contexto del usuario que llama al desencadenador. El autor de la llamada de un desencadenador es el usuario que ejecuta la instrucción que hace que se ejecute el desencadenador. Por ejemplo, si el usuario Mary ejecuta una instrucción DELETE que hace que se ejecute el desencadenador DML DML_trigMary, el código dentro de DML_trigMary se ejecuta en el contexto de los privilegios de usuario para Mary. Los usuarios que desean introducir código malintencionado en la base de datos o la instancia del servidor pueden aprovechar este comportamiento predeterminado. Por ejemplo, el usuario JohnDoe
crea el siguiente desencadenador DDL :
CREATE TRIGGER DDL_trigJohnDoe
ON DATABASE
FOR ALTER_TABLE
AS
GRANT CONTROL SERVER TO JohnDoe ;
GO
Lo que significa este desencadenador es que en cuanto un usuario que tenga permiso para ejecutar una GRANT CONTROL SERVER
instrucción, como un miembro del rol fijo de servidor sysadmin , ejecute una ALTER TABLE
instrucción, JohnDoe
se le conceda CONTROL SERVER
permiso. En otras palabras, aunque JohnDoe
no puede conceder CONTROL SERVER
permiso a él mismo, habilitó el código activador que le concede este permiso para ejecutarse con privilegios escalados. Los desencadenadores DML y DDL están abiertos a este tipo de amenaza de seguridad.
Procedimientos recomendados de seguridad de desencadenadores
Puede tomar las siguientes medidas para evitar que el código de desencadenador se ejecute con privilegios escalados:
Tenga en cuenta los desencadenadores DML y DDL que existen en la base de datos y en la instancia del servidor consultando las vistas de catálogo sys.triggers y sys.server_triggers. La consulta siguiente devuelve todos los desencadenadores DML y DDL de nivel de base de datos en la base de datos actual y todos los desencadenadores DDL de nivel de servidor en la instancia del servidor:
SELECT type, name, parent_class_desc FROM sys.triggers UNION SELECT type, name, parent_class_desc FROM sys.server_triggers ;
Use DISABLE TRIGGER para deshabilitar los desencadenadores que pueden dañar la integridad de la base de datos o el servidor si los desencadenadores se ejecutan con privilegios escalados. La siguiente instrucción deshabilita todos los desencadenadores DDL de nivel de base de datos en la base de datos actual:
DISABLE TRIGGER ALL ON DATABASE
Esta instrucción deshabilita todos los desencadenadores DDL de nivel de servidor en la instancia del servidor:
DISABLE TRIGGER ALL ON ALL SERVER
Esta instrucción deshabilita todos los desencadenadores DML de la base de datos actual:
DECLARE @schema_name sysname, @trigger_name sysname, @object_name sysname ; DECLARE @sql nvarchar(max) ; DECLARE trig_cur CURSOR FORWARD_ONLY READ_ONLY FOR SELECT SCHEMA_NAME(schema_id) AS schema_name, name AS trigger_name, OBJECT_NAME(parent_object_id) as object_name FROM sys.objects WHERE type in ('TR', 'TA') ; OPEN trig_cur ; FETCH NEXT FROM trig_cur INTO @schema_name, @trigger_name, @object_name ; WHILE @@FETCH_STATUS = 0 BEGIN SELECT @sql = 'DISABLE TRIGGER ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@trigger_name) + ' ON ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@object_name) + ' ; ' ; EXEC (@sql) ; FETCH NEXT FROM trig_cur INTO @schema_name, @trigger_name, @object_name ; END GO -- Verify triggers are disabled. Should return an empty result set. SELECT * FROM sys.triggers WHERE is_disabled = 0 ; GO CLOSE trig_cur ; DEALLOCATE trig_cur;
Véase también
CREATE TRIGGER (Transact-SQL)
Desencadenadores DML
Desencadenadores DDL