Διόρθωση της έλλειψης παραλλαγής κρυπτογραφικού αλατιού στον κατακερματισμό σύνδεσης SQL Server sa

Στο Microsoft SQL Server 2005 και σε νεότερες εκδόσεις, πολλές παρουσίες SQL Server χρησιμοποιούν το ίδιο κρυπτογραφικό αλάτι για την ενσωματωμένη σύνδεση sa. Επειδή το αλάτι είναι το ίδιο για όλες τις εγκαταστάσεις, ορισμένα είδη επιθέσεων ωμής βίας γίνονται πιο πρακτικά εάν ο εισβολέας μπορεί πρώτα να αποκτήσει πρόσβαση στον κατακερματισμένο κωδικό πρόσβασης. Οι κατακερματισμένοι κωδικοί πρόσβασης είναι διαθέσιμοι μόνο στους διαχειριστές της SQL Server.

Συμπτώματα

Στο SQL Server 2005 και σε νεότερες εκδόσεις, το κρυπτογραφικό αλάτι δημιουργείται μαζί με τη σύνδεση sa. Εάν CHECK_POLICY είναι ενεργοποιημένο, το cryptographic salt δεν δημιουργείται ξανά όταν ο χρήστης αλλάζει τον κωδικό πρόσβασης για να είναι συνεπής με το ιστορικό κωδικών πρόσβασης. Από προεπιλογή, το CHECK_POLICY είναι ενεργοποιημένο για το SQL Server 2005. Όταν η CHECK_POLICY είναι απενεργοποιημένη, η συνέπεια του αλατιού δεν είναι πλέον απαραίτητη για τη σύνδεση sa και ένα νέο αλάτι αναδημιουργείται στην επόμενη αλλαγή κωδικού πρόσβασης.

Αν και αυτό ισχύει για όλους τους λογαριασμούς, ο λογαριασμός σύνδεσης sa δημιουργείται κατά τη διαδικασία κατασκευής. Επομένως, το αλάτι του δημιουργείται κατά τη διάρκεια της ίδιας διαδικασίας κατασκευής και διατηρείται κατά τη διάρκεια μιας περιόδου εγκατάστασης SQL Server.

Σημείωση Για SQL Server 2008, αυτό το ζήτημα επηρεάζει επίσης τις προεπιλεγμένες συνδέσεις που χρησιμοποιούνται από τη δυνατότητα διαχείρισης βάσει πολιτικής, αλλά μειώνεται ο κίνδυνος. Από προεπιλογή, αυτές οι συνδέσεις είναι απενεργοποιημένες.

Μετριασμοί

Ακόμα κι αν το κρυπτογραφικό αλάτι παραμένει το ίδιο σε πολλές εγκαταστάσεις, δεν θα ήταν αρκετό να θέσει σε κίνδυνο τον κατακερματισμό του κωδικού πρόσβασης. Για να εκμεταλλευτεί αυτήν τη συμπεριφορά, ο κακόβουλος χρήστης θα πρέπει να έχει πρόσβαση διαχειριστή σε μια παρουσία SQL Server για να αποκτήσει τον κατακερματισμό του κωδικού πρόσβασης. Εάν ακολουθηθούν οι βέλτιστες πρακτικές, οι απλοί χρήστες δεν θα μπορούν να ανακτήσουν τον κατακερματισμό του κωδικού πρόσβασης. Ως εκ τούτου, δεν θα ήταν σε θέση να εκμεταλλευτούν την έλλειψη κρυπτογραφικής διακύμανσης αλατιού.

Αιτία

Πληροφορίες Service Pack για το SQL Server 2005

Για να επιλύσετε αυτό το ζήτημα, αποκτήστε το πιο πρόσφατο Service Pack για το SQL Server 2005. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:

913089 Τρόπος απόκτησης του τελευταίου Service Pack για το SQL Server 2005

Πληροφορίες Service Pack για SQL Server 2008

Για να επιλύσετε αυτό το ζήτημα, αποκτήστε το πιο πρόσφατο service pack για το SQL Server 2008. Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για προβολή του άρθρου στη Γνωσιακή Βάση της Microsoft:

968382 Τρόπος απόκτησης του τελευταίου Service Pack για το SQL Server 2008

Επίλυση

Για SQL Server Service Pack 2 ή νεότερες εκδόσεις, μπορείτε να εκτελέσετε την ακόλουθη δέσμη ενεργειών για να επαναφέρετε το κρυπτογραφικό άλας του λογαριασμού σύνδεσης sa. Για να εκτελέσετε τη δέσμη ενεργειών, πρέπει να έχετε συνδεθεί με έναν λογαριασμό που έχει δικαιώματα CONTROL SERVER ή ο λογαριασμός πρέπει να είναι μέλος του ρόλου διακομιστή sysadmin. Θα πρέπει να γνωρίζετε ότι, αφού επαναφέρετε το κρυπτογραφικό αλάτι, θα γίνει επίσης επαναφορά του ιστορικού κωδικού πρόσβασης για τη σύνδεση 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

Για SQL Server 2008, μπορείτε να εκτελέσετε την ακόλουθη δέσμη ενεργειών. Για να εκτελέσετε τη δέσμη ενεργειών, πρέπει να έχετε συνδεθεί με έναν λογαριασμό που έχει δικαιώματα CONTROL 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

Στο SQL Server 2008, μπορείτε να επαναφέρετε το αλάτι κρυπτογράφησης για τις συνδέσεις διαχείρισης βάσει πολιτικής χρησιμοποιώντας την ακόλουθη δέσμη ενεργειών. Για να εκτελέσετε τη δέσμη ενεργειών, πρέπει να έχετε συνδεθεί με έναν λογαριασμό που έχει δικαιώματα CONTROL 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

Λύση

Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για ένα ζήτημα που αφορά τα προϊόντα της Microsoft που παρατίθενται στην ενότητα "Ισχύει για".
Το ζήτημα αυτό διορθώθηκε αρχικά στο SQL Server Service Pack 4 για SQL Server 2005.
Το ζήτημα αυτό διορθώθηκε για πρώτη φορά στο SQL Server 2008 Service Pack 2 για SQL Server 2008.

Κατάσταση

Η Microsoft ευχαριστεί τους ακόλουθους που συνεργάζονται μαζί μας για την προστασία των πελατών:

Περισσότερες πληροφορίες