Di Microsoft SQL Server 2005 dan versi yang lebih baru, beberapa instans SQL Server menggunakan garam kriptografi yang sama untuk login sa bawaan. Karena garamnya sama untuk semua instalasi, jenis serangan brute force tertentu menjadi lebih praktis jika penyerang dapat terlebih dahulu mendapatkan akses ke kata sandi yang di-hash. Kata sandi hash hanya tersedia untuk administrator SQL Server.
Gejala
Di SQL Server 2005 dan versi yang lebih baru, garam kriptografi dihasilkan bersama dengan login sa. Jika CHECK_POLICY diaktifkan, garam kriptografi tidak dibuat ulang saat pengguna mengubah kata sandi agar konsisten dengan riwayat kata sandi. Secara default, CHECK_POLICY diaktifkan untuk SQL Server 2005. Ketika CHECK_POLICY dinonaktifkan, konsistensi garam tidak lagi diperlukan untuk login sa, dan garam baru dibuat ulang pada perubahan kata sandi berikutnya.
Meskipun ini berlaku untuk semua akun, akun login sa dibuat selama proses pembuatan. Oleh karena itu, garamnya dibuat selama proses build yang sama dan dipertahankan selama instans penyiapan SQL Server.
Catatan: Untuk SQL Server 2008, masalah ini juga memengaruhi proses masuk default yang digunakan oleh fitur Manajemen Berbasis Kebijakan, tetapi risikonya berkurang. Secara default, login ini dinonaktifkan.
Mitigasi
Bahkan jika garam kriptografi tetap sama di beberapa instalasi, itu tidak akan cukup untuk membahayakan hash kata sandi. Untuk mengeksploitasi perilaku ini, pengguna yang jahat harus memiliki akses administratif ke instans SQL Server untuk mendapatkan hash kata sandi. Jika praktik terbaik diikuti, pengguna biasa tidak akan dapat mengambil hash kata sandi. Oleh karena itu, mereka tidak akan dapat mengeksploitasi kurangnya variasi garam kriptografi.
Penyebab
Informasi paket layanan untuk SQL Server 2005
Untuk mengatasi masalah ini, dapatkan paket layanan terbaru untuk SQL Server 2005. Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
913089 Cara mendapatkan paket layanan terbaru untuk SQL Server 2005
Informasi paket layanan untuk SQL Server 2008
Untuk mengatasi masalah ini, dapatkan paket layanan terbaru untuk SQL Server 2008. Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
968382 Cara mendapatkan paket layanan terbaru untuk SQL Server 2008
Resolusi
Untuk SQL Server 2005 Paket Layanan 2 atau versi yang lebih baru, Anda dapat menjalankan skrip berikut untuk mengatur ulang garam kriptografi akun masuk SA. Untuk menjalankan skrip, Anda harus masuk dengan akun yang memiliki izin CONTROL SERVER, atau akun harus menjadi anggota peran server sysadmin. Anda harus menyadari bahwa, setelah Anda mengatur ulang garam kriptografi, riwayat kata sandi untuk login sa juga akan diatur ulang.
-- 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
Untuk SQL Server 2008, Anda dapat menjalankan skrip berikut. Untuk menjalankan skrip, Anda harus masuk dengan akun yang memiliki izin CONTROL SERVER, atau akun harus menjadi anggota peran server 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
Di SQL Server 2008, garam kriptografi untuk login Manajemen Berbasis Kebijakan dapat diatur ulang menggunakan skrip berikut. Untuk menjalankan skrip, Anda harus masuk dengan akun yang memiliki izin CONTROL SERVER, atau akun harus menjadi anggota peran server 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
Solusi
Microsoft telah mengonfirmasi bahwa ini adalah masalah dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".
Masalah ini pertama kali diperbaiki di SQL Server 2005 Paket Layanan 4 untuk SQL Server 2005.
Masalah ini pertama kali diperbaiki di SQL Server 2008 Paket Layanan 2 untuk SQL Server 2008.
Status
Microsoft berterima kasih kepada para pihak berikut karena telah bekerja sama dengan kami untuk membantu melindungi pelanggan: