Go standart kriptografi kütüphanesinin FIPS 140-2 ve FIPS 140-3 uygulama yapısı

FIPS 140 (Federal Information Processing Standard Publication 140)
FIPS 140, ABD NIST tarafından oluşturulan bir kriptografik modül güvenlik sertifikasyon standardıdır. Bu standart, belirli bir kriptografik modülün veya kütüphanenin NIST tarafından tanımlanan güvenlik gereksinimlerini karşılayıp karşılamadığını değerlendirir. Dolayısıyla, FIPS 140 sertifikasının alınmış olması, ilgili modülün resmi olarak güvenilebilir bir güvenlik düzeyine sahip olduğu ve finans, sağlık ile savunma gibi güvenliğin kritik önem taşıdığı alanlarda kullanılabileceği anlamına gelir.
FIPS 140, 1994 yılındaki ilk kabulünün ardından 2001 yılında FIPS 140-2 ve 2019 yılında ise FIPS 140-3 olarak revize edilmiştir. Günümüzde dahi pek çok sistem ve uygulama, FIPS 140-2 veya FIPS 140-3 sertifikasını zorunlu kılmaktadır.
FIPS 140 ve Programlama Dilleri
Bu nedenlerden ötürü, FIPS 140 sertifikalı kriptografik modüller, çeşitli programlama dillerinde ve ortamlarda fiili bir standart olarak kullanılmaktadır. Başlıca örnekler arasında OpenSSL, BoringSSL, LibreSSL ve NSS yer almakta olup, bunlar güvenliğin ön planda olduğu uygulamalarda en yaygın kullanılan modüllerdir.
FIPS 140 sertifikalı modüllerin çoğunluğu C veya C++ dilinde yazılmıştır. Bu sebeple PHP, Python ve JavaScript gibi dillerde bu modüller doğrudan kullanılmak yerine harici sağlayıcı (Provider) modülleri aracılığıyla entegre edilerek FIPS ortamı oluşturulur. Lakin bu yaklaşım bazı kısıtlamaları beraberinde getirmektedir.
Sürüm Uyuşmazlığı Sorunu
FIPS 140 sertifikasyonu yalnızca belirli sürümler için geçerlidir. Dolayısıyla, modülün en son sürümünü kullanmak için sertifikasyon sürecinin tekrarlanması gerekmektedir ve bu süreçte uygulamanın kullandığı modül ile FIPS sertifikalı modül arasında sürüm uyuşmazlıkları ortaya çıkabilir. Yetkilendirilmemiş bir sürümün kullanılması durumunda, ilgili ortam artık FIPS sertifikalı bir ortam olarak kabul edilmez.
Dinamik Yükleme ve Performans Düşüşü
Poek çok dil, FIPS 140 sertifikalı modülleri dinamik kütüphane biçiminde yükleyerek kullanır. Bu yöntem, başlatma ve yürütme aşamalarında performans düşüşüne yol açabilir ve çalışma zamanında bir sorun meydana gelmesi durumunda tüm uygulamanın kararlılığını doğrudan etkileme riski taşır.
Güvenlik Açıkları
Yukarıda belirtildiği üzere, OpenSSL Provider gibi harici modüllerin entegre edildiği yapılarda, söz konusu modüldeki güvenlik açıkları doğrudan uygulamaya yayılma riski barındırır. Ayrıca uygulama ile harici modül arasındaki iletişim katmanının kendisi ek bir saldırı yüzeyi oluşturur ve bunu korumak için ayrı bir güvenlik katmanı gereklidir. Bu durum karmaşıklığı artırarak öngörülemeyen güvenlik açıklarına sebep olabilir.
FIPS 140 ve Golang
Bu gerekçelerle Golang farklı bir strateji benimsemiştir. Go, FIPS 140 sertifikasını harici araçlara bağımlı olmadan doğrudan resmi şifreleme kütüphanesi üzerinden destekleme yolunu seçmiştir. Dolayısıyla geliştiricilerin ayrı bir sağlayıcı yüklemesine veya yapılandırmasına gerek kalmaksızın, standart crypto paketini olduğu gibi kullanırken yalnızca FIPS sertifika modunu (GOFIPS=1) etkinleştirmeleri yeterlidir. Bu süreçte harici modüllerle olan iletişim sınırı ortadan kalkarak güvenlik artmakta ve yalnızca tek bir statik derlenmiş ikili dosya (binary) dağıtıldığı için operasyonlar da basitleşmektedir.
FIPS 140-2 ve Golang
Bu amaç doğrultusunda Golang, BoringSSL tabanlı BoringCrypto modülünü Go çalışma zamanına (runtime) entegre ederek FIPS 140-2 sertifikasını elde etmiştir. BoringCrypto, Go 1.19 sürümünden sonra belirli dağıtımlarda etkinleştirilebilmektedir ve bu sayede Go uygulamaları, harici ek modüllere ihtiyaç duymadan FIPS 140-2 sertifikalı bir ortam oluşturabilmektedir.
Ancak BoringCrypto, OpenSSL tabanlı olduğundan ötürü hâlâ C dili bağımlılığı barındırmaktadır. Bu nedenle Go uygulamaları tamamen bağımsız ikili dosyalar olarak derlenememekte ve gerekli C kütüphanelerinin de birlikte dağıtılması zorunluluğu sürmekteydi.
FIPS 140-3 ve Golang
Go ekibi bu kısıtlamaların üstesinden gelmek adına mevcut Go standart crypto kütüphanesini FIPS 140-3 şartnamesine uygun şekilde iyileştirmiştir. Geliştirilen bu modül Go 1.21 sürümünden itibaren deneysel olarak sunulmaya başlanmış olup halihazırda NIST nezdinde FIPS 140-3 sertifikasyon değerlendirme süreci devam etmektedir.NIST FIPS 140-3 Değerlendirmesindeki Modüllerin Listesi
Bu durum, Go şifreleme kütüphanesinin olgunluk düzeyini gözler önüne sermekte ve bu sayede Go, tamamen bağımsız tek bir ikili dosya ile FIPS 140-3 sertifikalı bir ortam sunabilir hale gelmektedir.
Ayrıca Go ekibi yalnızca FIPS 140-3 standardını karşılamakla kalmamış, kendi bünyesinde güvenliği daha da pekiştirmiştir.
Fail Fast
Go'nun FIPS modu, Fail Fast güvenlik modelini benimsemekte olup, sertifikasız algoritmaların çağrılması durumunda yürütmeyi derhal bir panic ile durdurmaktadır. Bu durum, diğer dillerdeki sağlayıcı tabanlı modellerin geri dönüş (fallback) olasılığı bırakmasının aksine, güvenlik ve düzenlemelere uyum açısından daha katı ve net bir güvence sunar.
Hedged Signature
FIPS 140-3 standardı, ECDSA imzalarında RFC6979 yöntemini tavsiye etmektedir. Lakin Go bunun ötesine geçerek Hedged yöntemini dahil etmiş ve imzalama sürecinde ortaya çıkabilecek yan kanal saldırılarına (side-channel attacks) karşı daha güçlü bir direnç sağlamıştır.
Güçlendirilmiş Rastgele Sayı Üreteci
Go'nun rastgele sayı üreteci, kullanıcı alanı DRBG (Deterministic Random Bit Generator) kullanırken işletim sistemi çekirdeğinden ek entropi enjekte ederek yalnızca kullanıcı alanında değil, çekirdek alanında da yüksek kalitede rastgele sayılar üretir. Bu sayede rastgele sayı üretecinin güvenliği daha da artırılmaktadır.