Комментарии 169
А вот вывод в конце статьи хорошо бы поддержать, авторам надо платить, тогда они будут поддерживать свое ПО в актуальном и работоспособном состоянии… но ведь многие ищут открытое ПО как раз для того, что бы за него не платить… короче, проблема стара как мир, коммунизм это идеальный строй, если где-то набрать 100% настоящих коммунистов… а ложка дёгтя, как известно, испортит бочку мёда…
авторам надо платить, тогда они будут поддерживать свое ПО в актуальном и работоспособном состоянии…
Это не работает в масштабе всей экосистемы. Авторам платного софта выгодно поддерживать «особенность» своего софта, чтоб повышать цену перехода (чтоб поменьше народа уходило, проще говоря). См. софт небольшой частной конторы под названием Microsoft.
То есть вот буквально: если всем будут платить за поддержку и актуальность — у всех появится соблазн к окукливанию, прямо пропорционально объему выплат.
При этом забрать-то он может, а вот получить он с этого ничего на первое время не получит (а получит только тогда, когда достаточно вырастет в популярности, чтоб быть заметным). При этом у любого нового мейнтейнера при сравнимой популярности с прошлым — соблазн на окукливание будет всё точно такой же.
А в случае с открытым софтом редко платят. И тут высказано мнение, что платить было бы неплохо. Другое дело, непонятно, как кооперироваться заказчикам. Если каждый будет платить своим мейнтейнерам, будет дорого.
В общем случае, нужно сделать форк и назначить работника на зарплату, который будет проверять патчи из апстрима и мержить в этот форк, ну и своё что-то дописывать, возможно. Таким образом, для конкретного заказчика, этот работник станет мейнтейнером.
Собственно, сейчас в стане свободного софта происходят не очень приятные вещи. Пока он был где-то там, уделом тру гиков всё было хорошо, но… Гик культура стала модной, интерес к свободному ПО возрос катастрофически и саморегулирующее общество поползо в анархию. Этого следовало ожидать, но никто не ожидал.
Очень грустно это наблюдать, просто очень. История с leftpad это лишь вишенка на торте на острие айсберга, проблема настолько глубокая, что исправить что-то будет очень тяжело. Какие-то проекты, конечно, встанут под крыло Microsoft, Google, Mozilla, Canonical, но на всех не хватит и чёрт его знает, что будет дальше. Надеюсь лишь, что интерес к гик культуре поутихнет, схлопнется и все отстанут от опен сорса. Хочу, чтобы снова линуксом пользовались от силы 1% пользователей!
В случае рэдхат замена мантейнера, условно, миллиард. В случае майкрософта — условно сто миллиардов. Для обычного пользователя и то и другое — невозможная сумма, а значит и разницы нет. Для страны, например, или транснациональной корпорации — это как раз принципиальная разница.
С кибернетисом аналогично. Есть потенциальная возможность заменить, некоторые заказчики могут это потянуть при необходимости.
Или более другой пример — PostgreSQL и Postgresql Professional — товарищи с удовольствием подпишут и договор на сопровождение и доработки будут под вас делать (или объяснять как использовать то что уже есть правильно), и версию с сертификатом ФСТЭК продадут и версию которая умеет 'чуть больше' чем текущая Open- source версия. И они не одни такие.
Пусть и невозможно вписаться в столько жёсткие ограничения с реализацией всего желаемого, всё равно кажется, что возможно основательно снизить сложность нашего софта.
Впрочем, стандартизация библиотек идет полным ходом, что обусловленно нормальным эволюционным процессом. Думаю, еще лет двадцать и стандартный набор будет.
Кто помешает один раз дёрнуть библиотеку для галочки (а то и не дергать, если проверка будет просто по наличию в зависимостях), а дальше использовать что-то своё?
Это только в дополнение к предыдущим комментариям.
Стандартные библиотеки — это ассемблер высокого уровня. Антивирусные компании давно научились делать выводы о наличии вирусов по коду, даже их наработок десятилетней-двадцатилетней давности может хватить, даже не учитывая нынешнего развития в области ИИ.
Мешает отсутствие возможности такой универсальной проверки. Можете погуглить "Проблема останова".
Нет, не решена. Поиск вирусов на 95% идёт по сигнатурам. Это абсолютно другое и никак не мешает создать вирус, который не ловится (до следующего обновления сигнатур).
Для антивируса — хорошо. Но для проверки, что "программа делает только то что заявлено в её профиле", бесполезно. Вы никак не узнаете, что в программе есть какая-то ещё функциональность. В общем виде я имею ввиду, через универсальный проверяльщик. Банально — представьте, калькулятор, который всё делает правильно, но при умножении 5*5 добавляет единицу. Как это можно выяснить, кроме набора тестов специально для этой программы? Каким должен быть этот универсальный проверяльщик? Разве что ИИ с навыками программиста, тогда появляется шанс.
но для него существует проблема: ресурсоёмкость.
Вы это так утверждаете, как будто это вообще возможно. Чуть больше ресурсов и вирусы будут ловиться. Это даже для вирусов неправда, а уж в общем случае, для поиска уязвимостей и "левых" функций в программе — даже в теории невозможно.
Но вы можете попробовать подтвердить ссылками возможность, если хотите, с удовольствием ознакомлюсь.
Вот когда эвристика будет отрабатывать быстрее чем поиск по сигнатурным базам тогда уже можно будет пересматривать методы.
Хуже, кстати, дела обстоят с тем когда вредоносный функционал для своего дела использует вполне легальные инструменты — те же самые системные утилиты. Приложение ничего не отправляет в сеть, но оно может запустить экземпляр браузера, который сделает всё для него. И ведь доступ браузеру в интернет же не запретишь… Или скажете надо будет вести ещё и списки приложений которые может запустить библиотека или о боги использовать OLE, отправить сообщение уже открытому окну браузера… ой методов ещё с миллион найдётся.
Это кстати чем-то похоже на обучение компьютера игре в шахматы. В теории, пока он ничего не знает ему доступен только полный перебор всех вариантов ходов — а это можно делать до конца вселенной.
как раз в теории доказать что программа выполняет некое деструктивное действие(заранее заданный критерий)
Если заранее заданный критерий, например, "уходит в бесконечный цикл", то как раз именно в теории нельзя. Проблема останова. В смысле теорема есть, которая говорит, что это невозможно.
Если вы считаете, что для других критериев это возможно, то следует это доказать. Иначе по умолчанию считаем, что как минимум не для всех. Наверняка найдутся ещё критерии, для которых это невозможно будет сделать.
Эвристики повышает шансы, я с вами согласен. Но изначальный разговор был не о шансах, а о надёжной системе, проверяющей другой код. Если же наша задача просто снизить шансы проблем и уязвимостей, то это возможно, да.
Если заранее заданный критерий, например, «уходит в бесконечный цикл», то как раз именно в теории нельзя. Проблема останова. В смысле теорема есть, которая говорит, что это невозможно.Если строго, то на машине с конечным объёмом памяти эта задача для математики тривиальна (т.к. рассматриваем конечный автомат). Нерешаемой проблемы останова нет, если рассматривать алгоритм и конкретный компьютер, например, с оговоркой «не более 2TB RAM».
Вы можете дать более строгое доказательство? Я, конечно, могу просто проверить вам на слово, но не хотелось бы.
Пока опираюсь на имеющееся доказательство.
Совершенно не очевидно, что если у нас алгоритм с конечной памятью, то возможен анализатор с конечной памятью. Конечный автомат тут не помощник — бесконечный цикл не обязан жрать много памяти.
Для машины с конечной памяитью можно (теоретически) выписать все возможные состояния памяти и разрешённые переходы между ними. Получаем ориентированный граф, в котором легко можно обнаружить тупики (остановку) или циклы (зависания).
Поскольку проблема остановки сформулирована так, что при вычислениях машина работает с известным входом (новые данные не поступают), мы знаем начальное состояние и граф переходов. Граф конечный, переходы детерминированы. Значит, за конечное число шагов либо придём к останову, либо зайдем в цикл, который будет из-за своей детерминированности повторяться вечно.
Хорошо, а как узнать-то, дойдем ли мы за конечное число шагов до цикла или до конца? Если для прохождения этих шагов потребуется потребуется время вселенной? Может с математической точки зрения оно конечно, но практическая реализация невозможна.
Кстати, я придумал пример. Ханойская башня. Как узнать, не зациклится ли алгоритм? Ну то есть очевидно, что нет, но как мог бы выглядеть универсальный алгоритм, который это определит?
Может с математической точки зрения оно конечно, но практическая реализация невозможна.Тем не менее, для математики это не есть неразрешимая задача, если вопрос только в ресурсах.
Кстати, я придумал пример. Ханойская башня. Как узнать, не зациклится ли алгоритм?Если рассматривать машину с конечной памятью, у нас будет 3 массива конечного размера (для 3 столбиков) + массив вспомогательных данных (все переменные программы, текущая выполняемая строка, стек конечного размера и т.п.).
Нужно выполнять алгоритм, запоминая перед каждым шагом содержимое всех массивов. Либо алгоритм завершится, когда перекладывание будет завершено, либо он придёт в состояние, которое мы уже ранее фиксировали, значит зациклился. Т.к. кол-во возможных конфигураций чисел в массивах конечно (числа тоже ограниченной длины, например, int), то и не получится генерировать бесконечную последовательность новых конфигураций.
Я, честно говоря, не подразумевал математику, когда имел ввиду "в теории". Я подразумевал теоретический алгоритм, способный выполниться на существующих компьютерах (до того, как они рассыпятся в прах)
В таком раскладе с вами соглашусь. Наличие бесконечного времени решает проблему, потому что перебор состояний действительно конечен.
За описание способа спасибо.
Проверку на то, что программа делает только то что заявлено в её профиле.А как сделать проверку, что программа правильно делает то, что заявлено? Достаточно удалить одну строчку, которая обрабатывает какой-нибудь граничный случай, и в программе появляется уязвимость. И никакая эвристика ничего не найдёт, если только не была запрограммирована специально на эту ситуацию. То есть, анализатор должен знать предметную область.
Ведь можно сделать куда проще(что и сделано!) — цифровая подпись и доверие производителю. ЦП можно отозвать, если и будут инценденты — они будут носить единичных характер. Всё, тупая ЦП решает проблемы вмешательства в код приложения, а репутация производителя и его ответственность — проблему встраивания зловреда на этапе сборки/проектирования. И не нужны какие-то сложные анализаторы учитывающие всё-на-свете но всеравно остающиеся дырявыми.
(Доступ к данным можно ограничить разными способами, но кроме ограничения области, в которой можно открывать файлы, особо ничего не придумать. В линуксе этим занимается например firejail. Поэтому если открыть приложению доступ к файлам, надо либо обеспечить невозможность передать информацию на сторону — что сложно, либо ограничить область доступности.)
Приложения, которые одновременно и по сети и по файловой системе принято класть в firejail/chroot или ограничивать как-то иначе. Вообще приложениям доступ к файловой системе не нужен вообще либо нужен очень ограниченный доступ в пределах разрешённой зоны. То же с библиотеками.
Никто и не обещал что всё будет просто.
Банить надо приложения, которые пытаются получить возможность делать то что не должныИ это опять неформализуемый критерий, что возвращает нас к ручной проверке всех исходников.
Доступ к данным можно ограничить разными способами. В линуксе этим занимается например firejailМожно, но это другой класс решений, нежели проверка библиотек, с которыми линкуется наш проект.
Насчёт библиотек — возможно, это вообще неизбежный процесс. Вы думаете, поддержка софта в нынешнем виде это вообще нормально? Когда приходится раз в несколько лет менять методики программирования и изучать новые технологии. Унификация происходит постепенно.
И хорошо бы увидеть ваше решение проблемы.
я вам всё пытаюсь объяснить что возможно и без ИИ и уже есть и работает. А вы всё как в танкеТак покажите пальцем, где это работает.
Вы думаете, поддержка софта в нынешнем виде это вообще нормально? Когда приходится раз в несколько лет менять методики программирования и изучать новые технологииНормально, потому что меняются ожидания юзеров от информационных систем. Раньше им нормально было с перфокартами работать, потом с текстовыми консолями, затем с графическими приложениями, сейчас уже хотят, чтобы через всё работало через браузер, завтра захотят VR. Как тут обойтись однажды сделанными библиотеками?
И даже если привлекать искусственный интеллект — почему нет? ИИ это вообще громкий термин, то что сейчас называют ИИ интеллектом не является, но в определённых областях работает.Именно, что для этой задачи нужен полноценный, сильный ИИ, а не то, что сейчас им называют. А такого нет ни у кого.
И хорошо бы увидеть ваше решение проблемы.Решение проблемы — экономическое. Хотите надёжность — платите за аудит всего кода, как за атомный авианосец. Хотите за 3 копейки — примите риски, что все ваши данные могут рухнуть (делайте бекапы).
К сожалению, класс подобных проблем может быть решён только в частных случаях. Те же виртуальные методы в языках, возможность на лету переназначить процедуру-обработчик и вся схема проверки летит к чертям.
Если для доступа к файлам есть набор апи, то никакие виртуальные методы не пройдут мимо этого апи. Либо оно используется, либо нет. Это не замок, это набор свойств, что-то вроде списка затребованных интерфейсов.
Одна из реализаций: приложение или функция (часть библиотеки) перед выполнением требует адреса методов для доступа к сети, дискам, памяти и т.д. Не имея доступа к методам, оно просто не сможет получить такой доступ. Соответственно можно сравнивать списки запрошенных методов и список методов, которые приложение зарегистрировало для себя. Это даже не потребует анализа исходных кодов, это защитит от генерации кода на лету, это просто реализовать.
Другая реализация: приложение вызывает только функции в явном виде. Статический анализ эти функции отслеживает и сравнивает со списком разрешённых. Тот же эффект — несовпадение списков означает что приложение делает не то что надо.
Действительно, все проблемы это не решит, но решит очень многие. Решит проблемы всех библиотек, которым не нужен файловый доступ и не нужна сеть — процентов 99 библиотек наверно будет. Остальные надо как-то иначе проверять.
Очередная утопия.
Если покрытие 99% — то это не такая и дыркаНет, все злодеи будут целенаправленно целить в незакрытый 1%.
Это как с антивирусами — какой смысл писать вирус, если он определяется и ловится эвристикой. Имея под рукой антивирус, автор вируса допиливает свой вирус до тех пор, пока антивирус не перестал срабатывать.
перед выполнением требует адреса методов для доступа к сети
Вот это, кстати, интересная идея.
Навскидку проблема в утечке адресов. Когда приложение узнает адрес, куда стучаться, косвенным методом. Ну и ничто не мешает приложению запросить права для полезных операций, а заодно сделать вредную.
уже есть и работает. А вы всё как в танке
Если я вам скажу, что вечный двигатель уже есть и работает — вы мне поверите на слово? Вряд ли. Вот и вам на слово не верят, что есть универсальный анализатор подобного рода.
Все библиотеки как апи и политика разрешений, как вы описали ниже — намного более рабочий вариант, чем анализатор (хотя вы, вероятно, не видите разницы), но он сильно замедлит выполнение (потому что есть ли у приложения право вызвать Х — нужно проверять). Это было бы хорошим направлением, если б у нас был запас по вычислительной мощности ещё пару порядков, но это вряд ли. Закон мура загнулся.
А вы предлагаете сделать такое решето, чтобы было нельзя воде вытекать.»
так понятно?
Вот это точная аналогия. Так понятно?
При чём тут /dev/udp и линуксВы пишете, что у библиотеке, которая работает с файлами, не должно быть доступа в сеть. Я отвечаю, что это нереально проверить, т.к. через файлы можно стучаться в сеть.
Я предлагаю сделать чтобы было нельзя.Техническое решение заключается в чём? Пока это декларация на уровне анекдота «зайчики, станьте ёжиками».
Техническое решение очевидно — убрать из линукса возможность стучаться в сеть через файлы. Это как бы очевидно и технически реализуемо.
P.S. про практический смысл и сколько всего сломается, я не говорю. Но технически это не магия в стиле ёжиков.
Насколько вероятно запретить /dev/usb: Я не специалист в написании мобильных приложений, но нестабильная связь должна сама по себе накладывать ограничения на использование прямого доступа к /dev/usb, так что запрет доступа к нему не так уж маловероятен (ну или необычность его использования на практике). С развитием спутникового интернета даже сам протокол tcp будет использоваться меньше, понадобится какая-то прослойка для компенсации задержек и увеличения скорости передачи и надёжности, так что внедрение каких-то сетевых посредников так же невредно.
Вообще использование стандартных библиотек открывает некоторые дополнительные возможности во автоматическому тестированию во время выполнения программы — хотя бы подстановкой отладочных версий библиотек.
Доверие — это не boolean, это float.
Последнее время у меня ни одно приложение не требует прав при установке. Требуют в процессе работы. Надеюсь, это фича, а не баг ).
Надеюсь, это фича, а не баг )
по ходу аналогично. скорее всего, фича новых андроидов — приложения типа устанавливают, а потом говорят «работать не буду, если не разрешишь все-все-все». Второй способ шантажа более действеннный, меньше вероятность отказа на этом этапе.
И да, запрос разрешений на лету — это фича новых андроидов, с 6-го или 7-го андроида такое ВОЗМОЖНО. Причем можно установить 3 состояния: запретить всегда, спрашивать, разрешить всегда.
Надоели, значит, безошибочные, используемые десятилетиями утилиты? Ну-ну.
Раньше разница между открытым и закрытым кодом была качественной.
А нынче открытый код во многом настолько обфусцировался (тоннами зависимостей, кривым стилем и т.д.), что зачастую дизассемблер после его компиляции оказывается лаконичнее и понятнее, чем многочисленные "слои" исходников.
Вот ещё один мысленный эксперимент: может ли новый (но опытный) разработчик за 2 недели (80 часов) понять 80% кодовой базы, за которую он будет отвечать?
Если нет, то этот человек перегружен работой с первого дня, поскольку он по определению не сможет передать свои обязанности в течение стандартного для США периода времени. Если он уходит, вы никак не сможете подготовить замену в положенный срок. Как следствие, плавный переход невозможен, а некоторые знания о предметной области неизбежно будут потеряны.
Не очень корректный эксперимент: понимать кодовую базу с нуля без посторонней помощи и понимать кодовую базу с помощью того, кто длительное время за неё отвечал, а то и сам писал почти всю — две большие разницы даже в случае прекрасной документации. Собственно для этого и даётся эти две недели прежде всего, как по мне — для передачи дел прежде всего.
Я много раз писал. Но еще раз напишу. Приходит эпоха оптимизации ПО. Оптимизации скорости, размера, понятности и т.д.
Все чаще будем читать подобные статьи.
Все чаще будем читать подобные статьиДля прихода эпохи нужно, чтобы не статьи появлялись, а сервисы массово появлялись такие, что не жрут по 300 МБ в браузере. И софт, помещающийся на дискетку.
то, что в зависимых либах бывают новые баги, и что их нужно своевременно обновлять и потом не забывать проверять после обновления — это древнее знание в индустрии (например). Странно даже что джаваскриптеры так долго не спотыкались о них.
(предположу — потому что раньше они новый код писали быстрее, чем старый устаревал, но техдолг их таки догнал ...)
Может кто-нибудь знает язык где возможно провернуть такое? Возможно ли это с текущими архитектурами ОС и процессоров?
Оформляйте свою функцию отдельным процессом, режьте ему доступ на уровне системы, взаимодействуйте любым IPC, от разделяемой памяти и сокетов до REST API.
Заодно модульность повысите и подумаете не раз, так ли нужен вам очередной «leftpad» в зависимостях и с такими бубнами, или можно обойтись приватным
Да, такая возможность предусматривается. How to: Run Partially Trusted Code in a Sandbox
Но типизация тут ни при чем. К тому же, ЕМНИП, эту песочницу уже несколько раз ломали.
По крайней мере байткод не очень сложно проверить на отсутствие вызовов опасных библиотек и использование рефлекшена.
Потому как в большом проекте найдётся пара мест, где пишется в файлы, например, для логирования. Доверять библиотекам-логерам тоже нельзя, потому что их можно переконфигурировать на запись в какой-то важный файл (например, в соседний, уже проверенный файл исходника записать небезопасный код), а не только во временную папку.
Я к тому, что с таким подходом придётся выкинуть все библиотеки и начинать принимать только специальным образом написанные, «доверенные». Что есть нереалистично. Может, тогда заодно формальную верификацию потребуем, раз уж всё равно всё с нуля.
А способов логирования, утрируя, всего два — в файл и в эластиксёрч, почему бы и не стандартизировать. (Конфиги Log4* кстати простой программист и не осваивает до конца даже на тривиальном уровне, как я недавно обнаружил в одном форуме — сложноват он для масс, хотя и казался удобным — слишком много умеет). Логирование — отличный образец для унификации.
Программирование потихоньку переходит в корпоративный сегмент, где вопросы решаются просто — сколько стоит создание и поддержка. А стоит унификация всяко дешевле поддержки зоопарков.
Местные гуру убеждённо утверждают, что log4net — прошлый век, и вообще надо использовать мета-логеры (которые принимают на себя поток и могут раздавать его в другие логгеры, в тот же log4net), например, serilog. Под впечатлением я даже один свой проект начал на serilog. Ну так, ничего особенного, логгер как логгер.
Так что, как бы вам ни хотелось, всегда будет толпа программистов, которым ваша унификация библиотек побоку.
Относительно вашего мегалоггера. От того что он мега, не меняется ничего. Он будет принимать тот же набор данных что и любой другой, интерфейс одинаковый. Реализация может быть любой. Главное чтобы программист мог решить задачу логирования и при этом возможность вести логи не требовала предоставления например к директории /var/logs или сети в целом.
Мой вариант решения многих проблем — поставить программистов перед фактомАвтор этой статьи поставил всех программистов перед фактом: «всё плохо». Какие проблемы этим решены?
Поттеринг поставил всех перед фактом — или пользуйтесь, или скатывайтесь в позицию маргинала-человеконенавистника. И все вменяемые это воняли правильно. Нужен второй Поттеринг, чтобы навести порядок в опенсурсе. Его будут ненавидеть, писать всякие гневные посты про то что вот нам хочется логировать именно так а не иначе — когда найдётся такой с каменной посылалкой всех в попу и поддержкой от бизнеса, всё получится.
статью может увидят руководители и начнут разработчиков трясти как они могли пойти на подобное. Одна из проблем — безответственность программистов — таким образом если не решена, то будет контролироваться.Я на это ой как сильно надеюсь. Так и предвкушаю этот разговор: хотите хорошо? — дайте денег. По 100500 руб. за каждую фичу, чтобы не юзать непроверенный опен-сорс, а писать самому. Нет денег? — тогда что вы предлагаете?
А очень просто. Запретят использования тех языков и технологий, которые допускают подобное.В рамках фирмы — буду очень рад. Ведь это такое счастье не сидеть кодить тупую бухгалтерию или очередной интерфейс по тупому ТЗ, а собственноручно создавать сложные системные библиотеки, ходить самому по всем граблям (куда уж без этого). Если фирма настолько богата, как Microsoft, почему нет )))
интерфейс одинаковый. Реализация может быть любойАбсолютно нет. Функциональность разная. Разные политики блокировки файлов, разные возможности (например, может писать логгер ID процесса или потока в префикс, или не может), разные абстракции (те же самые appenders и loggers в log4*).
Если думаете, что ничего принципиального нового всё равно нет, то вот оно — Structured Logging. Там ещё работать и работать до полного понимания требований и унификации.
А вот что делать? Если бы можно было сказать простой ответ… Их нет. Есть робкие попытки поправить core инфраструктуру (например, недавно libsvg перешёл на версию, переписанную на расте, и это big fucking deal, потому что от неё зависят 100500 приложений, так что во многих приложениях, наверное, работа с svg станет чуть лучше и чуть надёжнее), но у нас огромные пласты легаси-кода, которые шуршат даже в shiny new версиях софта.
Систему ПО невозможно контролировать целиком, надо доверять. Компиляторы и ОС, на которых эти компиляторы работают, среды исполнения и сборки, ОС на которой софт работает…
Просто верьте. И да, читать Документацию (aka исходный текст) иногда нужно и полезно. Есть робкая надежда, что читающих достаточно много.
Вторая важная вещь — мы можем это всё увидеть, то есть хотя бы аудит проводить легко и без всяких мрачных NDA.
Понятно, почему Elm предпочитает принимать написанные целиком на нем пакеты, а не биндинги к js.
Де-факто закрытые исходники: аргументы в пользу понятного софта