- 1
Как вы думаете, что может делать функция getAlabamaTimezone(now: Date) ?
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
Как вы думаете, что может делать функция getAlabamaTimezone(now: Date) ?
2) Узнать сам часовой пояс Алабамы относительно времени, данного в аргументе.
Хотя может быть и наоборот, конвертит время из алабамского в utc...
– В своей сестре.
– А, точно!
Т.е. она возвращает true/false?
Я надеюсь, хоть не на клиенте?
Я надеюсь, время хоть в UTC/с сохранением таймзоны?
Нет, просто UI покажет неправильное состояние (а когда дело дойдет до транзы, приложение просто ругнется нотификашкой с ошибкой от бэка). Операции с билетами на уровне данных делает бэк.
> Я надеюсь, время хоть в UTC/с сохранением таймзоны?
Да, при расчетах времени все даты приводятся к UTC.
современное программирование это когда ты написал логику на беке а потом еще раз на фронте, но уже на другом языке (например, на TS)
Потом написал ее на свифте для иоса и на котлине для андроида.
Если есть бизнес знание "пуськи бятые не могут быть в крапинку", то его придется писать и на беке (чтобы они не попали в базу) и на фронте (чтобы подсветить формочку).
Правильное решение -- написать это один раз, и сгенерить из этого код бека и фронта.
Буткемп приносил какую-то схему для валидации форм декларативной, но я забыл
Да, из этого возникли isomorphic приложения (актуально только в контексте веба), кодогенерация по всяким JSON-чикам (главное чтобы инициализация фронта и бэка использовала один и тот же конфиг, в котором расписаны валидаторы и пр). Но между валидацией фронта и бэка не всегда 1-1 соотношение
Очень много копипасты логики между ними, и это грустно
В небольших (веб) приложениях достаточно монолита.
https://www.youtube.com/watch?v=o111yYPqLHU&t=4420s
Возможности исполнителя ограничены в первую очередь не ею, а его устройством. Тьюринг-полнота лишь означает, что с помощью языка исполнителя мы можем решить все задачи, относящиеся к bounding context исполнителя (html-ем и css-ом мы не можем например сделать фоторедактор). Майнкрафт тоже Тьюринг-полный...
В случае JS это еще означает, что браузер может сожрать кучу памяти, и всё нафиг зависнет. Или что этот JS может нагружать процессор некоторой хренью, о которой я не просил (например майнить что-нибудь).
>(html-ем и css-ом мы не можем например сделать фоторедактор)
А зачем делать фоторедактор на JS?
> Майнкрафт тоже Тьюринг-полный...
И?
Потому что это простой способ сделать кросс-платформенный софт, который не нужно ставить.
Сделать его на плюсах и Qt будет намного сложнее и дороже, увы.
и всё сломать
Если бы бразуер умел только документы показывать (как было во времена HTML 3.2 когда можно было смотреть сайты вообще без JS) то проблемы бы не было
const arr = [];
while(1) {
arr.push(new Object());
}
и всё сломать
Проблема это JavaScript-а или все же браузера, который слишком много памяти для процесса позволяет выделять (в Хромом движок детектит deadlock на обработку юзерских ивентов и говорит: "не, чет слишком долго выполняется" и предлагает остановить выполнение скрипта - такой проблемы нет) (то что сам скрипт виснет - проблема уже самого программирования на JS)?
Через минуту? Через секунду?
Что значит "много памяти"? Много -- это сколько?
В общем случае мы не можем доказать, что какое-то говно не зациклилось. Ты же знаешь про проблему остановки, да?
По истечению таймера на ожидание доступности обработчика юзерского события. Скрипт выполняется в параллельном от tab manager-а процессе/потоке.
> Через минуту? Через секунду?
Через 10-20 секунд, не больше. Для прикладного приложения not of concern.
> Ты же знаешь про проблему точки останова, да?
Которая тут bound-ится процессом(ами) движка JS. Если зависает из-за этого весь браузер и тем более вся ОС - ну значит памяти/CPU слишком мало, в ОС неправильно приоритеты процессов выставлены. Проблема JS кода тут только в том что из-за него виснет движок.
"В том, что у меня при выполнении глючного кода на GPU отказал центральный процессор, виноват язык GPU а не архитектура материнской платы". Никакие системы не устойчивы к экплоитам на 100%.
> "В том, что у меня при выполнении глючного кода на GPU отказал центральный процессор, виноват язык GPU а не архитектура материнской платы".
К самому JS как к языку программирования я тут кстати не доебывался (хотя можно, но это тема отдельного разговора). Если б вместо JS в браузер встроили какой-нибудь Tcl или Lua, сути бы это не изменило
Я доебывался до того, как этот язык используется в браузерах, что всякие говносайты могут невозбранно выжрать память и процессорное время. Ссылку я уже кидал https://www.youtube.com/watch?v=o111yYPqLHU&t=4420s
а зря. Если у TS есть хоть какие-то плюсы, то у JS их совсем нет
Когда же все уже поймут, что проблема постановы и питуринг-пестрота абсолютно ни на что не влияют?!
Ставим лимит 10 секунд и 100МБ. Кто не выполнил - прибивать. Настройки лимитов для каждого сайта отдать пользователю (как с настройками криптушни, микрофона и т.п.).
Касательно постановы:
* Если у меня есть полиамидный ай-горит определения проблемы постановы, да пусть даже лунейный, но который проверяет реальный скрипт за 60 секунд, никто не будет ждать, кроме довольных ма-те-ма-ти-ков.
* Если у меня есть мгновенный детектор постановы, но он не просчитывает время постановы и потребление памяти во время работы, то толку от него всё равно нет. 5 минут и 10 гигабайт спустя пользователь скрипт всё равно убьёт, это для 99% людей бесконечность.
* Если у меня есть мгновенный детектор постановы, времени и памяти, то я не буду зря запускать ненужную питушню и ждать таймаут, но у меня функциональность не будет работать.
Касательно пестроты:
* Бесконечной ленты байтов не бывает. Бесконечного времени не бывает. Способность/неспособность что-то вычислять на них ни о чём не говорит.
* Тройной вложенный цикл по всему диапазону short будет и без питуринговой пустоты эквивалентен бесконечному вычислению на бесконечной ленте.
P.S. Особенно весело вышло с тестом Тьюринга. Тот в шутку что-то сказал, но сектанты её приметили и начали строить свои философствования.
Думаю что если браузер не будет выдерять много памяти, почти никто этим браузером пользоваться не станет, т.к. уже написано куча говнокода на JS который кучу памяти требует для своей работы и используется на куче сайтов, и эти сайты в таком браузере работать тупо не будут.
Возможно. Но и в нативных приложениях хватало vulnerabilities, ведущих систему юзера к отказу.
Уровень безопасности современных браузеров на данный момент (2021 год) недостаточен, регулярно появляются новые уязвимости, позволяющие выполнить произвольный код с правами того пользователя, от чьего имени браузер запущен. CVE-2021-30632 в хроме например https://threatpost.com/google-chrome-zero-day-exploited/169442/
Именно поэтому я за apparmor. Ещё один слой поверх песочницы браузера...
Наконец-то можно "безопасно" запускать Флэш..
Можно еще в виртуалку это всё засунуть, как в Qubes OS. https://www.qubes-os.org/doc/gui/ - там вообще под каждое приложение свой огороженный Xorg сделан
> All AppVM X applications connect to local (running in AppVM) Xorg servers that use the following “hardware” drivers:
> dummyqsb_drv - video driver, that paints onto a framebuffer located in RAM, not connected to real hardware
> qubes_drv - it provides a virtual keyboard and mouse (in fact, more, see below)
Ну тут уже оверхед по диску/памяти становится слишком большим, к сожалению... Плюс всё аппаратное ускорение идёт в пизду: не буду же я по видюхе на каждое приложение покупать.
Так что это уже для чуваков, которые от трёхбуквенных агентств бегают.
Пусть возможные сисколы и аргументы будут ограничены хардварно!
Было же хардварное переключение контекстов, но нет бля, нам перформанс важнее
В случае с "тонким" сендбоксом ты получаешь сотню-другую сисколлов и ещё сотню-другую иоктлов. На этом уровне на порядки сложнее построить что-то секьюрное. Если вообще возможно.
И это даже если запретить иксы, пульсу, DRM и кучу других протоколов.
Ядро в спец таблице прописывает какие сисколы доступны, и пусть за этим следит процессор как он следит за IO и памятью.
Все вот эти lockdown, seccomp, apparmor, selinux и ещё десяток LSM как раз таки пытаются что-то обрезать на уровне сисколлов. Семь (?) неймспейсов для ядерных объектов вон даже прикрутили.
Столько лет умные чуваки с этой задачей бьются, и всё равно что-то проскакивает, какие-то неочевидные атаки остаются.
Составить "список разрешённых сисколлов и их аргументов" не так просто, как тебе кажется.
Это все давно придумали. https://man7.org/linux/man-pages/man2/seccomp.2.html
Что "процессор"? А сейчас за этим GPU следит, или что?
кто не дает мне вызвать запрешщенный сискол?
Как системный вызов, который какие-то там другие системные вызовы разрешает или не разрешает. А как это еще можно было б реализовать? Переписать ядро Linux на VHDL чтобы вот системные вызовы Linux ядра были частью процессора, или что ты блядь предлагаешь? Что там процессор должен следить?
заебись идея, надо торвальдсу передать
Если бы у каждого процесса была таблица сисколов (как сейчас есть таблица страниц) которую заполняло бы ядро, то следить за допустимыми сисколами мог бы процессор.
По-моему я четко написал:
https://govnokod.xyz/_27840/#comment-779379
А как бы по-твоему процессор понимал, что вот сейчас выполняется вот этот процесс, и ему можно вот эти системные вызовы, а вот сейчас произошло переключение контекста, и теперь выполняется другой процесс, которому можно другие системные вызовы? Ему об этом ядро ОС должно сообщать? А почему б самому ядру ОС при системных вызовах не проверять системные вызовы, по-твоему там будет супербольшой оверхед? И кстати есть еще seccomp-bpf, через который можно сделать ограничения вида "системный вызов write может писать только в файловый дескриптор 1 и не более чем 512 байт за 1 раз" - пример вот там можешь посмотреть https://book.hacktricks.xyz/linux-unix/privilege-escalation/docker-breakout/seccomp
Или ты хочешь в сам процессор встроить понятие каких-нибудь процессов и планировщик?
Ну во-первых переключение контекста и так сопровождается загрузкой других Page tables, точно также можно было бы и грузить таблицы сисколов.
Во-вторых когда-то была идея хардварного переключения контекстов, но оно не используется, хотя и есть в проссоре.
>seccomp-bfp
а BPF у нас тюринг-полный?:)
Задачи про "не более чем 512 за раз" это скорее про перформанс, чем про безопасность, это можно оставить и в ядре
>Или ты хочешь в сам процессор встроить понятие каких-нибудь процессов?
Ну так они и были в Hardware Task Switching же
Не, ну можно конечно, но особой выгоды в этом нет. Можно и ядро ОС аппаратно реализовать в процессоре, только тогда для обновления ОС надо будет новый процессор покупать
> Во-вторых когда-то была идея хардварного переключения контекстов, но оно не используется, хотя и есть в проссоре.
Потому что оказалось тормозной хуйней. https://stackoverflow.com/a/2761422
> а BPF у нас тюринг-полный?:)
Нет. https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
Before executing the BPF bytecode kernel ensures that it's safe:
All the jumps are only forward, which guarantees that there aren't any loops in the BPF program. Therefore it must terminate.
All instructions, especially memory reads are valid and within range.
The single BPF program has less than 4096 instructions.
All this guarantees that the BPF programs executed within kernel context will run fast and will never infinitely loop. That means the BPF programs are not Turing complete, but in practice they are expressive enough for the job and deal with packet filtering very well.
Отлично! А теперь запрети писать слово "хуй" в дескриптор 1.
Модулем ядра можно такое реализовать.
Или огороженый процесс может срать в какой-нибудь пайп, из пайпа потом читает другой процесс и ищет там слово "хуй". Если не находит, тогда пишет уже в дескриптор 1
Ну вот, уже прокси надо городить, которая тоже добавляется к поверхности атаки, состояние какое-то хранить для каждого клиента...
А ведь это фундаментальная проблема -- очень много нетривиальных IPC'шек написано поверх байтовых стримов. И существующие механизмы тут могут только сказать "похуй, пусть общаются о чём хотят" или "нахуй, они вообще не будут общаться".
Не, ну вообще можно через системный вызов ptrace всякой хуйни понаделать. https://www.alfonsobeato.net/c/modifying-system-call-arguments-with-ptrace/
Т.е. если трассируемый процесс пробует делать вызов write(), другой процесс его приостанавливает и что-то там может поменять, в том числе и поискать "хуй" в передаваемом буфере
Можешь погуглить ptrace sandbox
seccomp вроде тоже умеет отправлять на дальнейший анализ в ptrace. Чтобы совсем все вызовы под ptrace не гонять.
Ну тут тоже огромный простор для багов и уязвимостей...
Можно, к примеру, увидеть "ху" и от радости забыть, что дальше конец буфера.
Или забыть тот факт, что прошлый буфер закончился на "ху".
Т.е. сам ptrace-sandbox становится частью attack surface... И его тоже надо загонять в сендбокс по-хорошему. Или писать на чём-то безопасном.
Если б проверка на слово "хуй" была реализована в ядре, это было б еще хуже для секурности. Так что в идеале надо формально доказывать.
Ты реально не понимаешь проблему? Суть не в том, как запретить. Суть в том, что запретить.
Никто тебе на этот вопрос не ответит со 100% уверенностью.
Тут видимо надо делать простой и понятный набор сисколов и делать прослойку поверх него, а потом делать белый список.
когда у тебя 500 сисколов, то конечно никто ничего не понимает
Первая, на самом деле.
> делать простой и понятный набор сисколов
Да, к сожалению придётся всю ось, все протоколы и весь софт редизайнить с нуля. И никаких сокетов, пайпов, девнод и прочих "волшебных" сущностей, которые превращают "простые и понятные" read и write в неконтролируемые каналы связи.
Для каких-то встраиваемых решений это (с натяжкой) прокатит. Для десктопа и серверов это не взлетит никогда. Рыночек выберет совместимость.
Для сендбокса же это маунты, файлы, каталоги, симлинки, юникс сокеты, девноды,
права доступа и куча сисколлов для работы со всем этим.
Где больше вероятность отстрелить себе ногу и пропустить неочевидную дыру?
Джун просто лиспер был.
Я вот на Си почти не прогаю, но всегда стараюсь чистить внешние ресурсы в cleanup колбэке после их аллокации. Либо неотработавший воркер (например fetch) при изменении какого-то state. Иначе будут race conditions, dangling references (компонент удалился из дерева, а колбэк вызывает метод компонента и он еще висит в очереди неотмененным).
Или когда на этапе написания кода не проведено исследование по специфичному формату данных и пр., и ты прибегаешь к параметризации чтобы "на всякий случай".
DEsign Driven Development?
Внутри ифами раскидать, что куда.
для совместимости с K&R C?
ι-комбинатор неиллюзорно Тьюринг-полон: ι = λ f. f S K
через пол часа читай его вопрос на "otevy.mail.ru"
Было
Предлагал хотя бы
> Посоветовала ему почитать/прорешать
Почитал и добавил
1. backshifted_sin, argbackshifted_sin, backscaled_sin, argbackscaled_sin с "-" и "/"
2. logscaled_sin, arglogscaled_sin
3. sinsin
Это как в питере -- комбо из убийства и чревоугодия?
Придут неравнодушные и либо оставят только cos, либо переименуют sin/cos в wave/swav (shifted wave).
Пишите ли вы нормальные коммит месседжи чтобы ревьюер понимал что вы починили и как, или пидорские типа
?
Пишешь ли ты развернуто
* что было сломано
* почему
* как ты пончили.
Если issue звучит как "Failed to create Foo" то явно недостаточно указать задачу
> почему
Обычно описывается в той же задаче в Жире. А вообще если идет речь про тырпрайз, то ты привязан основное время к одному проекту и ты можешь обсудить с тем же аналитиком или тестировщиком детали. Стартапы плачут, колятся, бросают скоротечные портянки но продолжают пилить бабло на ИТ.
> что было сломано
> как ты починил
А это уже описывается в коммит-месседже да.
А в коммит обычно более кратко, чтобы не засирать людям лог... Кому захочется покопаться -- откроет задачу и почитает там.
У меня просто жопа горит когда есть ишью
И коммент у коммита
а в том коммите поменяли сорок четыре файла
"Зависало потому что обращалось не из итого потока и был дедлок. Я использовал Bar чтобы гарантоировать обращение из правильного потока"
так-то идея хорошая, только в рабочем ритме ей сложно следовать.
Стало понятно, что его можно трогать только из конкретного.
Об этом была написана дока у метода, вставлен ассерт, и все места его использования завернули в код, который ставит задачу пулу, который с этим тредом связан
ээ
ты можешь случайно закоммитить изменения, не имеющие отношения к задаче?
> А это просто у меня на машине линтер поработал
Кто дал слово этому петуху? Раньше это была просто кукарекалка, которую можно было просто игнорировать. Удивлён, что ей позволили писать своё авторитетное мнение в файлы, которые не изменялись, даже в IDE не открывались.
Потом другой чел открыл проект, и закоммитил уже
длинная история была у того файла
А потом они обижаются, что про фронтендеров столько мемов
– Всю ночь на стейдже автотесты гонял. Даже базу грохнул.
– Но у нас нет стейджа!
Хотя это больше про aqa, наверное
Я бы сказал, что среди веб-макак таких большинсво.
хук можно глобально как-то для репы прописать, чтоб не каждый питух отдельно это делал?
pre-receive
The first script to run when handling a push from a client is pre-receive.
тогда локально ты можешь себе срать, а запушить не сможешь
например у нас нельзя пушнуть файл более 10 мегабайт, и вроде нельзя форспушнуть в мастер
я имел в виду pre-commit hook, который автоматически подтягивается, когда делаешь clone
Проще действительно на серваке не пропускать.
Так что можно поставить правильную версию гита и наслаждаться автоматической установкой хуков и майнеров.
Ты просто скачал посмотреть, а тебя уже выебли.
А сборка проекта -- это уже осознанное действие обычно.
Ну ок, представь что ты склонил репу, создал бранч (и словил майнера в post-checkout), поправил ридмишку, закоммитил её (и словил майнера в pre-commit) и запушил (и словил майнера в pre-push).
Согласись, никто не ожидает, что от правки сраного текстовика на его компе исполнится произвольный код?
> никто не ожидает, что от правки сраного текстовика на его компе исполнится произвольный код
– а так же я не ожидаю, что мои коллеги рискнуть влепить майнер в скрипт в рабочей репе.
Ну т.е. уже нужен какой-то переключатель во время загрузки репы, доверяешь ты ей или нет? Какое-то осознанное действие для активации хуков.
Т.е. в общем-то можно засимлинкать каталог с ними куда надо после клона и не ебать мозг.
> можно засимлинкать каталог с ними куда надо после клона
– ну дык это каждому новому питуху придётся качать архив, распаковывать и делать симлинку. а питухи ленивые пошли и не хотят потратить две минуты на то, что им позже сэкономит часы.
вот мне и интересно стало, есть ли какой-то глобальный механизм
как я понял, нет, потому что с понтом security issues
Откуда, блядь, git знает рабочая она или от рандомного Васяна с гитхаба?
> качать архив
Дык закоммить их в репу! Останется только засимлинкать/скопировать одной командой, написанной в ридмихе той же репы. Или даже скрипт для этого приложи, чтобы одним кликом.
> Дык закоммить их в репу!
– симлинки ж всё равно придётся руками делать, не?
А как он поймёт, надо ему автоматически включать хуки или нет? Пусть из-за одного лентяя все регулярно ловят троянов, как с автораном в винде?
Или ты ему опцию будешь передавать при клоне?
ну то есть чем это в итоге отличается от остального набора скриптов, которые лежат в репе и могут быть произвольно запущены при той же сборке? аудит делать не нужно того, что ты качаешь?
Это уже дофига знать надо. Я могу годами пользоваться гитом, знать, что там могут храниться разные скрипты, но не знать про исполняемые хуки.
Примерно аналогично питушне про sudo. Нельзя просто зайти в исходники луникса и прочитать, что незаконный sudo пишет в Спортлото?
Или почти как с ярлычками. Нельзя просто зайти в бинарники винды и прочитать, что иконка может исполнить вредоносный код?
Одно дело - когда питузок пишет сайт с инъекциями, создаёт какой-то код, подключает к базе и запускает, а другое - когда он просто читает файлы.
– лол, так несекьюрно же
Ты его сознательно запустил. Сам. Понимая, что это рабочая репа. Возможно даже прочитав его перед этим.
а про то, что в папке hooks лежат скрипты с правами на исполнение и их количество, гиту не так уж сложно напиздеть в кококонсолечку при клоне
Ну разве что задать вопрос, как это делает ворд: Эта репа содержит хуки. Хуки могут выебать вас в жопу. Введите "ДА Я ХОЧУ ВКЛЮЧИТЬ ХУКИ", если действительно доверяете этой репе и хотите включить хуки.
Ты реально не чувствуешь разницы между "я запустил скрипт для сборки" и "я просто переключил ветку, решил выкачать свежую версию или закоммитил ридмишку, а оно пошло код исполнять"?
да, можно задать вопрос, как это делает ворд. это пиздец какое сложное архитектурное решение?
я почитал, как это сделано в fossil, и там вроде хуки добавляются командой для репы
но у них такая дока, что нихуя не понятно
> Создатель и владелец Telegram Павел Дуров сообщил, что в социальной сети у пользователей теперь не будет возможности отправлять анимированный значок с изображением баклажана и персика.
Какой референдум, какая демократия :)
З.Ы. Страйкер вот заранее приготовился и запретил их все.
Представляю CNN, всяки NBC, WaPo и NYT
– ничо, что там есть стикерпак с чуваком, у которого вместо головы жопа?