TRUSTWORTHY özelliği ON ise CLR kullanan veritabanı nesneleri, MSSQLSERVER servis kullanıcısının yetkileri dahilinde dış kaynaklara ulaşabilir. Eğer veritabanında TRUSTWORTHY özelliği “OFF” ise, CLR nesneleri, dış bir kaynağa ulaşmaya çalışırsa, hata alınır. Ayrıca, yazılım geliştirirken Assembly dosyalarını MS SQL Server içine gömmek gerekebilir. Bu durum için de veri tabanında “db_owner” haklarına sahip olmak, işletim sisteminde SYSTEM yetkilerine sahip olmak veya veri tabanında “sysadmin” rolüne sahip olmak gereklidir.
1) Durum: Güvenilir Olmayacak Şekilde Ayarlanmış Olan Veritabanı Sunucusunda TRUSTWORTHY Özelliğinin Etkinleştirilmesi
Trustworthy özelliği etkinleştirilecek olan MS SQL veritabanının IP adresi 172.22.71.247 olsun. Bu veritabanı güvenilir olmayan şekilde ayarlanmış olsun. Veritabanı sunucusundaki “test” adlı bir kullanıcı, standart bir veritabanı hesabıdır:
“test” hesabı MUSTERILER veritabanında “db_owner” rolüne sahiptir:
“sa” hesabı da MUSTERILER veritabanında “db_owner” rolüne sahiptir:
Not: Benzer olarak “deneme” adlı standart veritabanı kullanıcısı da HESAPLAR adlı veritabanında “db_owner” rolüne sahiptir.
Not: MS SQL veritabanı sunucusunda “test” (ve “deneme”) adlı standart yetkili kullanıcı ile “sa” gibi yetkili bir kullanıcının MUSTERILER (ve HESAPLAR) adlı bir veritabanında “db_owner” gibi ortak/yüksek yetkili olması veritabanı sunucusunun doğru bir şekilde konfigüre edilmemesinden kaynaklanmaktadır.
MUSTERILER veritabanının TRUSTWORTHY özelliği aşağıdaki gibi etkinleştirilmiştir:
ALTER DATABASE MUSTERILER SET TRUSTWORTHY ON
Benzer olarak HESAPLAR veritabanının TRUSTWORTHY özelliği de etkinleştirilir.
Sonuçta MUSTERILER veritabanının TRUSTWORTHY özelliği True olarak görüntülenmektedir:
Özetlemek gerekirse, MUSTERILER ve HESAPLAR veritabanları için TRUSTWORTHY etkindir. MUSTERILER veritabanında “sa” ve “test” hesapları, HESAPLAR veritabanında “sa” ve “deneme” hesapları db_owner rolündedir.
SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a INNER JOIN sys.databases as b ON a.name=b.name;
GOuse HESAPLAR
select rp.name as database_role, mp.name as database_user
from sys.database_role_members drm join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)
GOuse MUSTERILER
select rp.name as database_role, mp.name as database_user
from sys.database_role_members drm join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)
GO
2) Tehdit: Güvenilir Olmayacak Şekilde Ayarlanmış Olan Veritabanı Sunucusunda TRUSTWORTHY Özelliğinin Tehlikesi
Eğer MSSQL sunucuda bir veritabanı TRUSTWORTHY olarak ayarlanmış iken, bu veritabanının sahibi (“sa”) yüksek yetkili (veritabanı sunucusu üzerinde yetkili) ise ve MS SQL Server üzerindeki standart yetkilere sahip bir kullanıcı hesabı (web uygulamasına ait bir veritabanı kullanıcısı veya test amaçlı oluşturulmuş olan “test” hesabı gibi) da bu veritabanında tam yetkili (“db_owner” rolüne sahip) ise; standart yetkilere sahip olan hesap (“test”), veritabanının sahibinin yetkisi (“sa”) ile komut çalıştırılabilir. Örneğin, MSSQL sunucuda standart haklara sahip bu kullanıcı, kendisine MSSQL sunucusu üzerinde “sysadmin” rolü verebilir. Böylece MSSQL sunucusu üzerinde hak yükseltme işlemi gerçekleştirmiş olur.
3) Önlem: TRUSTWORTHY Özelliği Etkinleştirilen ve Güvenilir Olmayacak Şekilde Ayarlanmış Olan Veritabanı Sunucusunda Alınabilecek Önlemler
Belirtilen hak yükseltme zafiyetinden korunmak için, TRUSTWORTHY özelliği etkin olan ve sahibi “sysadmin” rolünde olan veritabanları tespit edilmeli, sonra da -zorunlu değilse- veritabanlarından bu özellik devre dışı bırakılmalıdır. Bu amaçla aşağıdaki komutlar kullanılabilir.
SELECT SUSER_SNAME(owner_sid) AS DBOWNER, d.name AS DATABASENAME FROM sys.server_principals r
INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
INNER JOIN sys.server_principals p ON p.principal_id = m.member_principal_id
INNER JOIN sys.databases d on suser_sname(d.owner_sid) = p.name
WHERE is_trustworthy_on = 1 AND d.name NOT IN (‘MSDB’) and r.type = ‘R’ and r.name = N’sysadmin’
GOALTER DATABASE MUSTERILER SET TRUSTWORTHY OFF
GOALTER DATABASE HESAPLAR SET TRUSTWORTHY OFF
GO
Benzer olarak gerekli değilse üzerinde TRUSTWORTHY özelliği etkin olan veritabanlarında bu özellik devre dışı bırakılmalıdır.
Kaynak:
Hacking SQL Server Stored Procedures – Part 1: (un)Trustworthy Databases