Korumalı Alana Sahip API Açıklaması

Sandboxed API (SAPI), köklü Sandbox2 projesini temel alır. Bu sayfada SAPI'nin tasarım mimarisi ve temel kavramlar açıklanmaktadır.

Genel Bakış

SAPI, geliştiricilere C/C++ kitaplıklarını korumalı alan için hazırlayacak araçların yanı sıra C/C++ kitaplıklarının korumalı alan sürümüyle iletişim kurmak için gereken API'leri sağlamak üzere tasarlanmıştır.

Bu şemada, SAPI korumalı alanında C/C++ kitaplığının mimarisi gösterilmektedir:

SAPI Diyagramı

SAPI ayrıca SAPI kitaplıkları ile ana makine kodu arasında manuel ve otomatik (özel işaretçi özelliklerine dayalı) bellek senkronizasyonu (diziler, yapılar) için temel öğeler sağlar.

Son olarak, üst düzey İşlemler API'si, SAPI kitaplıklarının izlenmesini sağlar ve başarısız olmaları durumunda (ör. güvenlik ihlalleri, kilitlenmeler veya kaynak tükenmesi nedeniyle) bunları yeniden başlatır.

Sandbox2

Açık kaynak projesi Sandbox2, Google güvenlik mühendisleri tarafından geliştirilip sürdürülmektedir ve SAPI tarafından kullanılan temel sanal alan teknolojisidir. Sandbox2 üç ana bileşenden oluşur: Korumalı Alan Politikası, Yürütücü ve Korumalı Alan.

Korumalı Alan Politikası

Korumalı alan politikası, korumalı alan kitaplığı için kısıtlanmış yürütme ortamını tanımlar. Bu, hangi sistem çağrılarının yürütülebileceği netleştirilerek yapılır. SAPI, Sandbox2 ile aynı mekanizmayı kullanır. Korumalı alan politikasının nasıl tasarlanacağı ve tanımlanacağı hakkında daha fazla bilgi için Sandbox2'nin Korumalı Alan Politikası bölümüne ve Başlangıç sayfasına bakın.

Varsayılan olarak, oluşturulan SAPI korumalı alan sınıfları DefaultConfig (sapi::SandboxConfig::DefaultConfig()) kullanılarak başlatılır. DefaultConfig(), korumalı alanı şunlarla yapılandırır:

  • sapi::Sandbox2Config::DefaultPolicyBuilder() ile oluşturulmuş varsayılan bir Sandbox2 politikası
  • sapi::Sandbox2Config::DefaultLimits() için varsayılan kaynak ve zaman sınırları
  • Paylaşılan bellek iletişimi etkin (DefaultPolicyBuilder() içindeki paylaşılan bellek izinleriyle eşlenir)
  • Korumalı alandaki temel günlük kaydı ve çalışma zamanı davranışını yapılandıran varsayılan komut satırı işaretleri (sapi::SandboxConfig::DefaultFlags()) ve ortam değişkenleri (sapi::SandboxConfig::DefaultEnvironmentVariables())

Korumalı alan politikasını veya yapılandırmasını özelleştirmek için sapi::SandboxConfig::DefaultConfig() ile başlayın, döndürülen sapi::SandboxConfig değerini değiştirin ve oluşturulan korumalı alan oluşturucusuna iletin (veya sandbox.h üstbilgi dosyasında özel bir korumalı alan alt sınıfı tanımlayın ve bu dosyayı sapi_library derleme kuralına iletin). Örneğin, sapi::Sandbox2Config::DefaultPolicyBuilder() ile başlayan bir politika oluşturabilir ve ek kurallar zincirleyebilirsiniz (veya daha kısıtlayıcı bir yapılandırma gerektiğinde doğrudan bir PolicyBuilder oluşturabilirsiniz). Ayrıca, işaret veya ortam değişkeni eklerken temel ayarların korunması için sapi::SandboxConfig::DefaultFlags() veya sapi::SandboxConfig::DefaultEnvironmentVariables() ile başlayabilirsiniz.

Korumalı alana alınmış kitaplık

Bu, Sandbox2 tarafından sağlanan kısıtlanmış korumalı alan ortamında yürütülecek korumalı alan C/C++ kitaplığıdır. Sonuç olarak korumalı alana alınmış kitaplık, ana makine kodu tarafından kullanılabilecek gerekli işlevleri sunar.

Korumalı alan kitaplığı, kısıtlanmış yürütme ortamını tanımlayan özelleştirilmiş bir korumalı alan politikası belirtebileceğiniz sapi_library derleme kuralıyla oluşturulur. Kitaplığa bağlı olarak sarmalayıcı veya taslak kod yazmanız gerekebilir (libcurl bölümüne bakın). Ancak SAPI sürümünü hazırlarken C/C++ kitaplığının kaynak kodunu değiştirmeniz beklenmez.

SAPI nesnesi ve RPC taslağı

SAPI nesnesi, korumalı alana alınmış kitaplığın API'sini gösteren bir C++ nesnesidir. Bu kitaplık, ana makine kodundan gelen çağrıları, SAPI kitaplığına yerleştirilmiş olan RPC Stub'a ve Sandboxed kitaplığına yönlendirir.

Bu iki öğe, sapi_library() derleme kuralı kullanılarak derleme sistemi tarafından otomatik olarak oluşturulur. SAPI, Google'ın Bazel ve CMake olmak üzere iki derleme sistemini destekler.

Barındırıcı Kodu

Ana makine kodu, SAPI kitaplığı tarafından sağlanan mantığı uygular. Bu, C/C++ kitaplığının korumalı alana alınmamış sürümünü kullanacak olan koddur. Bu nedenle, ana makine kodu, SAPI kitaplığı tarafından dışa aktarılan işlevleri çağırır, verileri korumalı alana geçirir ve korumalı alandan veri alır.

Ana makine kodunun, SAPI kitaplığını kullanacak şekilde uyarlanması gerekir. En önemlisi, kitaplık ayrı bir korumalı alan işleminde yer aldığından kitaplığın işlevlerini çağırmak mümkün değildir. Bu nedenle SAPI, SAPI kitaplığına yapılan çağrıları proxy'leyen bir SAPI nesnesi oluşturan araçlar sağlar.

Kavramlar

Bazel Derleme Kuralları

SAPI projesi, C/C++ kitaplığını korumalı alana almak için iki Bazel derleme kuralı sağlar:

  • sapi_library(): C/C++ kitaplığının Sandbox2 Sandboxee olarak korumalı alana alınması için gereken tüm çıkışları oluşturur. Derleme çıkışı, ana makine kodu ikilisini oluşturmak için kullanılan cc_binary() kuralının bağımlılığı olarak kullanılabilir.
  • sapi_interface(): Ana makine kodu ikilisine eklenebilecek başlığı otomatik olarak oluşturur.

Derleme kuralları hakkında daha ayrıntılı bilgi için Derleme Kuralları başlıklı makaleyi inceleyin.

Değişkenler

SAPI, SAPI Türleri adı verilen ve Ana Makine Kodunda kullanmanızı önerdiğimiz bir dizi özel tür sağlar. SAPI türlerinin gerekli olmasının temel nedeni, ana makine kodu ile korumalı alan kitaplığı arasındaki işlem ve dolayısıyla bellek yalıtımıdır.

Bu konunun daha kapsamlı bir açıklaması ve yaygın olarak kullanılan bazı SAPI türlerine genel bakış için Değişkenler başlıklı makaleyi inceleyin.

İşlemler

Yukarıda açıklandığı gibi, korumalı alan kitaplığına yapılan tüm API çağrıları bir RPC katmanı üzerinden iletilir. Bu katmandaki bir hatayı yönetebilmek için uygun hata yönetimini uygulamanız gerekir. SAPI Transaction modülü, bir korumalı alan kitaplığına yapılan tüm çağrıların RPC düzeyinde herhangi bir sorun olmadan tamamlanmasını veya ilgili bir hatayla döndürülmesini sağlamak için gerekli mekanizmayı sağlar.

Bu konuyla ilgili daha ayrıntılı bir açıklama için İşlemler başlıklı makaleyi inceleyin.

Başlarken

İlk Sandboxed API projenizi oluşturmak için Başlangıç sayfamızı okuyun.