Corregir la falta de cifrado variación salt en hash de inicio de sesión de sa de SQL Server

Seleccione idioma Seleccione idioma
Id. de artículo: 980671 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

En Microsoft SQL Server 2005 y en posteriores versiones, varias instancias de SQL Server utilizan la misma semilla criptográfica para el usuario sa predeterminado. Debido a que la semilla es la misma en todas las instalaciones, determinados tipos de ataques de fuerza bruta se pueden producir con mas facilidad si el atacante obtiene acceso en primer lugar a la contraseña encriptada. Las contraseñas encriptadas sólo están disponibles para los administradores de SQL Server.

Causa

En SQL Server 2005 y versiones posteriores, se genera el valor de salt criptográfica junto con el inicio de sesión sa. Si está habilitada CHECK_POLICY, no se vuelve a generar el valor de salt cifrado 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á deshabilitada la CHECK_POLICY, la coherencia de sal ya no es necesario para el inicio de sesión de sa y se vuelve a generar un nuevo valor de salt en el próximo cambio de contraseña.

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

Nota Para SQL Server 2008, este problema también afecta a los inicios de sesión predeterminada utilizada por la característica de administración basada en Directiva pero se reduce el riesgo. De forma predeterminada, se deshabilitan estos inicios de sesión.

Factores atenuantes

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

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 número de artículo siguiente 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 número de artículo siguiente para verlo en Microsoft Knowledge Base:
968382Cómo obtener el service pack más reciente para SQL Server 2008

Solución

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 la sesión con una cuenta que tenga los permisos del servidor de CONTROL o la cuenta debe ser un miembro de la función de servidor sysadmin. Debe tener en cuenta que, después de restablecer el valor de salt criptográfico, también se restablecerá el historial de contraseñas durante 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 la sesión con una cuenta que tenga los permisos del servidor de CONTROL o la cuenta debe ser un 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, el valor de salt criptográfica para los inicios de sesión de administración basada en directiva puede restablecerse mediante el uso de la siguiente secuencia de comandos. Para ejecutar la secuencia de comandos, debe ser iniciado la sesión con una cuenta que tenga los permisos del servidor de CONTROL o la cuenta debe ser un 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 "Se refiere a:".
Este problema se corrigió por primera vez en SQL Server 2005 Service Pack 4 para SQL Server 2005.
Este problema se corrigió por primera vez en SQL Server 2008 Service Pack 2 para SQL Server 2008.

Más información

Microsoft Gracias lo siguiente para colaborar con nosotros para ayudar a proteger a los clientes:

Propiedades

Id. de artículo: 980671 - Última revisión: domingo, 23 de diciembre de 2012 - Versión: 3.0
La información de este artículo se refiere a:
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Workgroup
Palabras clave: 
kbpasswords kbexpertiseadvanced kbsurveynew kbprb kbmt KB980671 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 980671

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com