Corregir la falta de variación de salt criptográfica de hash de inicio de sesión de sa de SQL Server

Síntomas

En Microsoft SQL Server 2005 y en versiones posteriores, varias instancias de SQL Server utilizan la misma sal criptográfica para el inicio de sesión de sa integrados. Porque el valor salt es el mismo para todas las instalaciones, ciertos tipos de ataques forzar ataques se convierten en más prácticos si el atacante primero puede obtener acceso a la contraseña con algoritmo hash. Contraseñas con algoritmo hash sólo están disponibles para los administradores de SQL Server.

Causa

En SQL Server 2005 y en versiones posteriores, se genera la sal criptográfica junto con el inicio de sesión sa. Si está habilitada CHECK_POLICY, sal de cifrado no se regenera cuando el usuario cambia la contraseña con el fin de ser coherente con el historial de contraseñas. De forma predeterminada, está habilitada CHECK_POLICY para SQL Server 2005. Cuando está deshabilitado el CHECK_POLICY, ya no es necesaria la coherencia salt para el inicio de sesión de sa, y se vuelve a generar un valor salt nueva en el próximo cambio de contraseña.


Aunque esto es cierto para todas las cuentas, la cuenta de inicio de sesión sa se genera durante el proceso de generación. Por lo tanto, su sal durante el mismo proceso de compilación se crea y se mantiene durante una instancia del programa de instalación de SQL Server.


Nota: Para SQL Server 2008, este problema también afecta a los inicios de sesión de predeterminado utilizados por la característica de administración de directivas basada en pero se reduce el riesgo. De forma predeterminada, estos inicios de sesión están deshabilitados.

Factores atenuantes

Incluso si el valor de salt criptográfica sigue siendo la misma a través de varias instalaciones, no sería suficiente para poner en peligro el hash de la contraseña. Para aprovechar este comportamiento, el usuario malintencionado tendría que tener acceso administrativo a una instancia de SQL Server para obtener el hash de la contraseña. Si se siguen las prácticas recomendadas, los usuarios normales será incapaces de recuperar el valor de hash de contraseña. Por lo tanto, ellos no podrían explotar la falta de variación criptográfica de salt.

Solución

Información del Service pack para SQL Server 2005

Para resolver este problema, obtenga el service pack más reciente para SQL Server 2005. Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
913089 cómo obtener el service pack más reciente para SQL Server 2005

Información del Service pack para SQL Server 2008

Para resolver este problema, obtenga el service pack más reciente para SQL Server 2008. Para obtener más información, haga clic en el siguiente número de artículo para verlo en Microsoft Knowledge Base:
968382 Cómo obtener el service pack más reciente para SQL Server 2008

Solución alternativa

Para SQL Server 2005 Service Pack 2 o versiones posteriores, puede ejecutar la siguiente secuencia de comandos para restablecer el valor de salt criptográfica de la cuenta de inicio de sesión sa. Para ejecutar la secuencia de comandos, debe ser iniciado sesión con una cuenta que tenga permisos CONTROL SERVER o la cuenta debe ser miembro de la función de servidor sysadmin. Debe tener en cuenta que, después de restablecer el valor de salt criptográfica, también se restablecerá el historial de contraseñas para el inicio de sesión sa.
-- Work around for SQL Server 2005 SP2+--
-- Sets the password policy check off for [sa]
-- Replaces [sa] password with a random byte array
-- NOTE: This effectively replaces the sa password hash with
-- a random bag of bytes, including the salt,
-- and finally sets the password policy check on again
--
-- After resetting the salt,
-- it is necessary to set the sa password,
-- or if preferred, disable sa
--
CREATE PROC #sp_set_new_password_and_set_for_sa(@new_password sysname, @print_only int = null)
AS
DECLARE @reset_salt_pswdhash nvarchar(max)
DECLARE @random_data varbinary(24)
DECLARE @hexstring nvarchar(max)
DECLARE @i int
DECLARE @sa_name sysname;

SET @sa_name = suser_sname(0x01);
SET @random_data = convert(varbinary(16), newid()) + convert(varbinary(8), newid())
SET @hexstring = N'0123456789abcdef'
SET @reset_salt_pswdhash = N'0x0100'
SET @i = 1
WHILE @i <= 24
BEGIN
declare @tempint int
declare @firstint int
declare @secondint int

select @tempint = convert(int, substring(@random_data,@i,1))
select @firstint = floor(@tempint/16)
select @secondint = @tempint - (@firstint*16)

select @reset_salt_pswdhash = @reset_salt_pswdhash +
substring(@hexstring, @firstint+1, 1) +
substring(@hexstring, @secondint+1, 1)

set @i = @i+1
END

DECLARE @sql_cmd nvarchar(max)

SET @sql_cmd = N'ALTER LOGIN ' + quotename(@sa_name) + N' WITH CHECK_POLICY = OFF;
ALTER LOGIN ' + quotename(@sa_name) + N' WITH PASSWORD = ' + @reset_salt_pswdhash + N' HASHED;
ALTER LOGIN ' + quotename(@sa_name) + N' WITH CHECK_POLICY = ON;
ALTER LOGIN ' + quotename(@sa_name) + N' WITH PASSWORD = ' + quotename(@new_password, '''') + ';'

IF( @print_only is not null AND @print_only = 1 )
print @sql_cmd
ELSE
EXEC( @sql_cmd )
go

---------------------------------------------------------------------------------------
-- Usage example:
--
DECLARE @new_password sysname

-- Use tracing obfuscation in order to filter the new password from SQL traces
-- http://blogs.msdn.com/sqlsecurity/archive/2009/06/10/filtering-obfuscating-sensitive-text-in-sql-server.aspx
--
SELECT @new_password = CASE WHEN 1=1 THEN
-- TODO: replace password placeholder below with a strong password
--
##[MUST_CHANGE: replace this placehoder with a new password]##:
ELSE EncryptByPassphrase('','') END
EXEC #sp_set_new_password_and_set_for_sa @new_password
go

DROP PROC #sp_set_new_password_and_set_for_sa
go

Para SQL Server 2008, puede ejecutar la siguiente secuencia de comandos. Para ejecutar la secuencia de comandos, debe ser iniciado sesión con una cuenta que tenga permisos CONTROL SERVER o la cuenta debe ser miembro de la función de servidor sysadmin.
-- Work around for SQL Server 2008--

------------------------------------------------------------------------
-- Set the password policy check off for [sa]
-- Reset the password
-- Set the password policy check on for [sa] once again
--
-- NOTE: The password history will be deleted
--
CREATE PROC #sp_set_new_password_and_set_for_sa(@new_password sysname, @print_only int = null)
AS
DECLARE @sql_cmd nvarchar(max);

DECLARE @sa_name sysname;

-- Get the current name for SID 0x01.
-- By default the name should be "sa", but the actual name may have been chnaged by the system administrator
--
SELECT @sa_name = suser_sname(0x01);


-- NOTE: This password will not be subject to password policy or complexity checks
-- if desired, this step can be replaced with a "throw away" password for
-- and set the real password after the check policy setting has been set
--
SELECT @sql_cmd = 'ALTER LOGIN ' + quotename(@sa_name) + ' WITH CHECK_POLICY = OFF;
ALTER LOGIN ' + quotename(@sa_name) + ' WITH PASSWORD = ' + quotename(@new_password, '''') + ';
ALTER LOGIN ' + quotename(@sa_name) + ' WITH CHECK_POLICY = ON;'

IF( @print_only is not null AND @print_only = 1 )
print @sql_cmd
ELSE
EXEC( @sql_cmd )
go

---------------------------------------------------------------------------------------
-- Usage example:
--
DECLARE @new_password sysname

-- Use tracing obfuscation in order to filter the new password from SQL traces
-- http://blogs.msdn.com/sqlsecurity/archive/2009/06/10/filtering-obfuscating-sensitive-text-in-sql-server.aspx
--
SELECT @new_password = CASE WHEN 1=1 THEN
-- TODO: replace password placeholder below with a strong password
--
##[MUST_CHANGE: replace this placehoder with a new password]##:
ELSE EncryptByPassphrase('','') END
EXEC #sp_set_new_password_and_set_for_sa @new_password
go

DROP PROC #sp_set_new_password_and_set_for_sa
go

En SQL Server 2008, puede restablecerse la sal criptográfica para los inicios de sesión de administración de directivas basada en utilizando la siguiente secuencia de comandos. Para ejecutar la secuencia de comandos, debe ser iniciado sesión con una cuenta que tenga permisos CONTROL SERVER o la cuenta debe ser miembro de la función de servidor sysadmin.
-------------------------------------------------------------------------- Set the password policy check off for the Policy principals
-- Reset the password
-- Set the password policy check on for them once again
--
-- NOTE:
-- These principals are not intended to establish connections to SQL Server
-- So this SP will also make sure they are disabled
--
CREATE PROC #sp_reset_password_and_disable(@principal_name sysname, @print_only int = null)
AS
DECLARE @random_password nvarchar(max)

SET @random_password = convert(nvarchar(max), newid()) + convert(nvarchar(max), newid())
DECLARE @sql_cmd nvarchar(max)

SET @sql_cmd = N'ALTER LOGIN ' + quotename(@principal_name) + N' WITH CHECK_POLICY = OFF;
ALTER LOGIN ' + quotename(@principal_name) + N' WITH PASSWORD = ''' + replace(@random_password, '''', '''''') + N''';
ALTER LOGIN ' + quotename(@principal_name) + N' WITH CHECK_POLICY = ON;
ALTER LOGIN ' + quotename(@principal_name) + N' DISABLE;'

IF( @print_only is not null AND @print_only = 1 )
print @sql_cmd
ELSE
EXEC( @sql_cmd )
go


EXEC #sp_reset_password_and_disable '##MS_PolicyEventProcessingLogin##';
EXEC #sp_reset_password_and_disable '##MS_PolicyTsqlExecutionLogin##';
go

SELECT name, password_hash, is_disabled FROM sys.sql_logins
go

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".
Este problema se corrigió primero en SQL Server 2005 Service Pack 4 para SQL Server 2005.
Este problema se corrigió primero en SQL Server 2008 Service Pack 2 para SQL Server 2008.

Más información

Microsoft agradece a trabajado con nosotros para ayudar a proteger a los clientes:
Propiedades

Id. de artículo: 980671 - Última revisión: 12 ene. 2017 - Revisión: 1

Comentarios