Windows

Sandboxing Python com isolamento de aplicativo Win32

Sandboxing Python pode ser muito útil para desenvolvedores, mas tem sido um repto devido à flexibilidade da implementação do CPython. É particularmente útil em muitos cenários ter o Python em sandbox. Por exemplo, em qualquer site que precise executar código facultativo dos usuários, uma vez que sites de prática de codificação ou intérpretes online. Também poderia ser útil para ajudar a prevenir ataques crescentes a LLMs (Large Language Models).

O Win32 App Isolation (https://github.com/microsoft/win32-app-isolation) abre um caminho dissemelhante para o sandbox do Python – não no nível da livraria Python, mas no nível do aplicativo/sistema operacional.

O Win32 App Isolation foi projetado para isolar o aplicativo Win32 criando um limite de segurança entre o aplicativo e o sistema operacional, usando a combinação de AppContainer, recursos virtualizados e sistema de arquivos de corretagem, o que ajuda a evitar que o aplicativo comprometa o sistema operacional.

A seguir estão os requisitos específicos e orientações para sandbox CPython com Win32 App Isolation em versões recentes do Windows Insider. Morosidade murado de 30 a 60 minutos e qualquer pessoa com a versão interna do Windows pode fazer isso em sua máquina sítio.

Para usar o Win32 App Isolation, você precisa da versão interna do Windows com número de versão> 25357 e da utensílio de empacotamento MSIX de https://github.com/microsoft/win32-app-isolation/releases/

Passo um:

Baixe o instalador Python para Windows em python.org. 3.12.2 foi usado para levante exemplo específico.

Passo dois:

Empacote-o seguindo a documentação (https://github.com/microsoft/win32-app-isolation/blob/main/docs/packaging/msix-packaging-tool.md). Talvez você precise de um certificado para assinar o pacote e instalá-lo (https://learn.microsoft.com/en-us/windows/msix/packaging-tool/create-app-package#signing-preference).

Juntar isolatedWin32-PromptForAccess capacidade para fins de prova, para que você possa permitir o entrada a determinados recursos em prompts. Sem esse recurso, todo entrada aos arquivos do usuário que não estejam explicitamente configurados para estarem disponíveis para o aplicativo seria recusado.

Juntar um alias python3.12.exe para usá-lo no PowerShell.

Passo três:

Instale o pacote. Use o alias definido python3.12.exe no PowerShell para transfixar o interpretador Python.

Uma captura de tela de um computador

Ao iniciar o interpretador Python, ele solicitará que você peça permissão para acessar o diretório de trabalho atual. O próprio Python seria criado com qualquer uma das opções – mas isso determina se o Python tem entrada aos arquivos no diretório atual.

Por exemplo, se você clicar em “Não” cá, não será mais verosímil listar os arquivos no diretório atual:

Uma captura de tela de um computador

A seleção será lembrada para que o aplicativo solicite qualquer registo/pasta unicamente uma vez. O usuário pode redefinir as permissões de registo em Configurações – Privacidade e segurança – Sistema de arquivos:

Uma captura de tela de um computador

O interpretador Python deve funcionar muito sozinho, já que nenhum código foi modificado.

Uma captura de tela de um computador

Os aspectos mais interessantes a serem verificados são os recursos de “sandboxing” – rede e sistema de arquivos.

Mas antes disso, tente executar um script usando Python solitário.

Uma captura de tela de um computador

Conforme você tenta acessar e executar um registo do usuário (o script), ele solicitará o entrada. Se recusado, o script não será executado:

Uma captura de tela de um computador

Permita-lhe rever alguns exemplos, começando pelo entrada à rede.

Porquê você não forneceu nenhum recurso de rede durante o empacotamento, o Python não terá nenhum entrada à rede. Confirme isso executando levante script:

def test_urllib(): 
    with urllib.request.urlopen("http://www.microsoft.com") as response: 
        print(response.read())
Uma captura de tela de um computador

Tente também acessar o sistema de arquivos.

def test_open(): 
    with open("../data/test.txt", "w") as f: 
        f.write("test")
Uma captura de tela de um computador

Foi mostrado um prompt para solicitar o entrada ao registo a ser gravado, e você pode negar esse entrada clicando em “Não”

Uma captura de tela de um computador

Também não funcionará com APIs nativas:

def test_native(): 
    handle = ctypes.windll.kernel32.CreateFileW("../data/test.txt", 0x10000000, 0, None, 1, 0x80, 0) 
    if handle > 0: 
        ctypes.windll.kernel32.CloseHandle(handle) 
    else: 
        raise RuntimeError("Failed to get the handle")
Uma captura de tela de um computador

Você também pode testar os.system() e subprocess:

def test_os_system(): 
    os.system("powershell -command cat c:/data/test/bin/data/test.txt") 
def test_subprocess(): 
    subprocess.run(("powershell", "-command", "cat", "c:/data/test/bin/data/test.txt"), shell=True)
Uma captura de tela de um computador

Importando módulos modificando sys.path irá acionar o prompt também:

def test_import(): 
    sys.path.append("../data") 
    import example
Uma captura de tela de um computador

Clicar em “não” negará o entrada ao módulo (example.pyestá no diretório de dados e clicar em “sim” irá importá-lo com sucesso):

Uma captura de tela de um computador

A partir dos exemplos supra, ao introduzir o Win32 App Isolation você pode ajudar a evitar que o Python acesse o sistema de arquivos e a rede sem consentimento.

Existem duas questões óbvias:

  1. Porquê você pode “clicar” nos prompts se quiser implantar isso em seu servidor? Porquê supra mencionado, isolatedWin32-promptForAccessé adicionado unicamente para fins de prova e não é necessário para isolamento. Sem ele, seu sistema simplesmente negaria qualquer entrada aos arquivos do usuário, ajudando assim a prevenir ataques uma vez que ransomware.
  2. Portanto, uma vez que você pode conceder entrada ao aplicativo para arquivos necessários, uma vez que módulos, scripts e dados? Há várias maneiras de fazer isso:
    • Você pode empacotar os módulos necessários em seu aplicativo e eles estarão acessíveis por padrão.
    • Você pode colocar o registo ao qual precisa acessar no perfil do aplicativo em %localappdata% onde o aplicativo recebe entrada maquinalmente.
    • Você pode colocar o registo em um “diretório do editor”, que é qualquer diretório com um nome que termine com o ID do editor do seu aplicativo em c:ProgramData. (win32-app-isolation/docs/fundamentals/consent.md em principal · microsoft/win32-app-isolation (github.com))
    • Você pode definir o entrada de arquivos e diretórios com icalcs para permitir que seu aplicativo ou todos os aplicativos os acessem.

Com a tecnologia, os usuários podem produzir soluções muito mais leves ao tentar executar código de uma nascente não confiável. Python solitário pode viver em paralelo com Python normal e funcionar uma vez que um tradutor de insignificante privilégio paralelamente. Ou, com a forma correta, pode ser usado sozinho, o que pode ajudar a proteger o sistema contra comprometimento, mantendo todas as funcionalidades do Python.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button