Защищенные оболочки .NET / C # - p / вызывается только в нашей безопасной безопасной сборке начальной загрузки, больше нигде - PullRequest
0 голосов
/ 10 июня 2019

Обзор системы: [native_app] <---> [доверенная сборка начальной загрузки] <---> [ненадежные сборки управляемых приложений]

Я хочу, чтобы из программы начальной загрузки была возможность p / invoke сделать обернутые вызовы нативных классов в наше нативное приложение, но только p / вызывает здесь.

Я хочу, чтобы ненадежные управляемые приложения блокировались, если они пытаются что-то предпринять.

Создал пользовательский AppDomain и настроил его по мере необходимости. Загрузите наш загрузчик и ненадежное тестовое приложение, которое ссылается на него, работающее в пользовательском домене приложений.

// Домен, настроенный в следующем коде C ++ / CLI

HRESULT SecureAppDomain_Configure()
{
    AppDomainSetup ^ads = gcnew AppDomainSetup();
    ads->DisallowCodeDownload = true;
    ads->ApplicationBase = "path_to_my_app";
    ads->PrivateBinPath = nullptr;

    System::String ^bootstrap_path = path_to_my_bootstrap;

    PermissionSet ^ps = gcnew PermissionSet(PermissionState::None);
    ps->AddPermission(gcnew SecurityPermission(SecurityPermissionFlag::Execution));

    Blob b;
    array<System::Byte>^public_key;
    bool ok = b.Create(public_key, "b1aab1aab1aa");

    if (!ok)
       return S_FALSE;

    System::Security::Permissions::StrongNamePublicKeyBlob ^_public_key = gcnew System::Security::Permissions::StrongNamePublicKeyBlob(public_key);

    System::Version ^version = gcnew System::Version("1.0.0.0");
    String ^trusted_assembly_path = bootstrap_path;
    StrongName ^trusted = gcnew StrongName(_public_key, trusted_assembly_path, version);

    // Set up the Evidence
    Evidence ^evidence = gcnew Evidence();
    evidence->AddHostEvidence(gcnew Zone(SecurityZone::Internet));

    m_domain = AppDomain::CreateDomain("my_sandbox", evidence, ads, ps, trusted);

    // Assign resolver.
    AppDomain::CurrentDomain->AssemblyResolve += gcnew ResolveEventHandler(Resolve_EventHandler);

   return S_OK;
}

Ожидаемые результаты. Ненадежное приложение должно быть заблокировано (исключение возбуждено), когда оно пытается выполнить p / invoke.

Текущие результаты: как наши загрузочные, так и ненадежные сборки приложений, которые ссылаются на него, могут p / invoke.

...