Gerçekten o kod mu çalışıyor, emin misin?

Sinan Taviloğlu
2 min readJul 3, 2023

Bir yazılım firması ile anlaştınız, geliştirmeyi yapıyorlar, dağıtımını yapıyorlar, kaynak kodun sahipliği de sizde. Bir sürü kontrolden geçiriyorsunuz kaynak kodu, güvenli mi vs. Her şey harika. Peki dağıtılan assembly’ler gerçekten sizin testlerinizden geçen kodu mu barındırıyor? Nasıl emin olabilirsiniz?

Senaryoyu farklılaştırmak mümkün tabi. Kendi geliştirdiğiniz yazılım için de benzer senaryolar kurulabilir, build ortamınızdan geçip dağıtılan paketlerin kodu gerçekten olması gereken kod mu? Belki build ortamınızda işin içine başka kodlar karışıyordur. Kim bilir belki de kullandığınız compiler’da bir trojan vardır :)

Veya nuget’ten indirip kullandığınız açık kaynak kodlu bir dll. Gerçekten github’da gördüğünüz o kod ile mi derlendi?

Photo by Max Bender on Unsplash

Yukarıdaki senaryoları “supply chain attacks” başlığı altında toplamak mümkün. Elimizdeki savunma sistemlerinden biri de bu yazının konusu olan “reproducible builds”.

Reproducible builds

.NET projeleri için reproducible build alabilmek için deterministik teriminin tercih edildiğini görüyoruz. Laplace’ın Şeytanı hesaplarını yapa dursun, bizim burada deterministik derlemeden kastımız, kodu tekrar tekrar derlediğimizde, eğer inputlar aynı ise çıktısının da her bit’inin aynı olması. Burada inputlar kısmı biraz kapsamlı ama biz aynı kodu verdiğimizde aynı assembly’yi elde etmemiz gerekiyor diye biraz basite indirgeyelim.

Yeni projelerinizde aşağıdaki gibi default olarak “deterministic” özelliğinin açık geldiğini göreceksiniz.

Visual Studio 2022 Community — Project Properties

Eski projelerinize de aşağıdaki compiler option’ın varlığını kontrol etmelisiniz.

<Deterministic>true</Deterministic>

Bu şekilde üretilmiş assembly’leri bit-by-bit karşılaştırmak için dosyaların hashlerini kıyaslamanızı sağlayacak bir tool kullanabilir ya da siz yazabilirsiniz.

Bu özelliği kullanmadığınızda projenizi tekrar tekrar derlediğinizde üretilen assembly’nin hash’inin değiştiğini göreceksiniz.

Projeyi farklı bir lokasyonda derlediğinizde kaynak kod dosyalarının pathleri değişeceği için yine farklı bir hash değeri ile karşılaşıyor olacaksınız. Bunun önüne geçmek için de PathMap option’ı kullanabilirsiniz.

<PathMap>$(MSBuildThisFileDirectory)=./</PathMap>

“Supply chain attacks”, “reproducible builds” konularına ve microsoftun bize sunduklarına kısaca dikkat çekmeye çalıştım. Konu ilginizi çektiyse, yazının içine serpiştirdiğim ve aşağıda paylaştığım bağlantıları ziyaret etmenizi şiddetle tavsiye ediyorum.

Umarım okuduğunuza değmiştir.

The Rise of Software Supply Chain Attacks

Security Best Practices

Deterministic builds in Roslyn

Source and Executable

Visual Studio — Hashing Source Code Files with Visual Studio to Assure File Integrity

ContinuousIntegrationBuild

Microsoft Government Security Program

--

--