На странице с описанием практического задания появился список часто (а, точнее, непрерывно) задаваемых вопросов, прочтение которого настоятельно рекомендуется.
На странице с описанием практического задания появился список часто (а, точнее, непрерывно) задаваемых вопросов, прочтение которого настоятельно рекомендуется.
Здравствуйте.
Это снова Вася.
Вы всё равно запускаете произвольный код, который пришёл с произвольного адреса от неизвстного человека. Даже с ограничениями (которые тоже не идеальны) это не очень хорошая идея. Заметьте, FLS сработал с первого раза (хотя был написан весьма криво), ни на какие ограничения я не наткнулся вообще.
Песочница — это, конечно, замечательно, но тут нужно не столько издевательство над скриптами и понижение их в правах, сколько регистрация пользователей. Заставляйте всех регистрироваться перед сдачей (как вариант — посылать по почте письмо вида «regme имя фамилия группа») с подтверждением руками. Или подписями в табличке на следующей лекции. А дальше принимать задания только с тех адресов, которые принадлежат списку разрешённых пользователей. За попытку обхода и нечестной игры — раздавать волшебные бананы.
Так, тут опечатка. Под FLS я имел ввиду свою программу, которая явно нечестным образом набрала единицу.
Вася, тот факт, что сработал FLS, конечно, расстраивает, но по сути дела ничего не мешает протестировать все решения потом, после окончания курса, на третьей выборке, и внезапно обнаружится, что у одних решений хорошая обобщающая способность и более-менее стабильный результат, а у других нет. Далее, ограничения на запись вещь необходимая и не обсуждается. А вот регистрация нужна, согласен, но даже и без неё злоумышленник Тапочкин в самом худшем случае всего лишь взломает виртуальную машину, и то ему надо постараться это сделать.
Риск при запуске хрен знает какого кода присутствует всегда, с этим ничего не поделаешь.
Я рекомендую посмотреть исходник программы. Она написана без учёта вашей выборки (я её не знаю) и должна корректно сработать на любой, в том числе и третьей, при соблюдении некоторых условий.
Никакого «обучения» (как вы писали) там вообще нет (или, точнее, я бы не назвал обучением то, что она делает).
На самом деле, программа написана как шутка и специально помечена как неправильная (несуществующая группа), код исключительно простой и при взгляде на него сразу видно, что никаким обучением там и не пахнет.
Но я всё равно рекоменую в следующем году устроить принудительную регистрацию.
В описанном вами худшем случае злоумышленник утащит информацию о проверочной выборке себе, что даст возможность тренировать методы не на ней, но проверять их с учётом вашей выборки, то есть допустит нечестную игру. И кто это сделал — понятно не будет. Отличия при проверке на третьей выборке будут, но небольшое отличие (0.1) у части людей может быть и чисто случайным. Вы уверены, что нашли забанили бы того, кто накрутил бы себе 0.1-0.2 описанным выше способом?
Я про это частично писал в письме.
И опять неправильный емейл.
Василий, вы переоцениваете важность вашей шуточной программы. Давайте разберемся
1) подобные конкурсы/задания проводятся ежегодно, в некоторых случаях организаторы идут на риск и принимают исходный код программы
2) взламывают в конечном счете все - даже ejudge
3) регистрация, конечно, нужна, но это не панацея. Потому что ничего не мешает вместо системы взломать почту одногруппника (это уж совсем элементарно бывает), и с неё отправлять хрен знает что
4) взломать машину еще надо суметь. При этом вам неизвестен даже её внешний ip, ведь вся работа происходит через gmail. Значит, взламывать вы её тоже будете, отправляя питоновский код, и пытаясь из него что-то сотворить. Если у вас есть на это время, вы можете этим заняться (правда, желательно, оставаться анонимным)
Я не писал, что она важная, я писал, что она из нескольких строчек. Понимаю, что ломают что угодно, но серъёзный взлом не стоит затраченных на него усилий (по поводу этого у нас читают соответвующий курс).
Регистрация отбреет большую часть ерунды, а делать какие-то более хитрые системы защиты слишком трудозатратно и неоправдано. Чтобы взломать соседу почту (как вы написали), надо по крайней мере серъёзно задаться целью напакостить. Чтобы послать бред из нескольких строчек с временного адреса и посмотреть, как она себя поведёт, нужно просто любопытство. Всё, что я хотел сделать — проверить, сработает ли такая штука на питоне (и слегка удивить сдающих курс). Если бы была регистрация — я бы не стал ломать соседу почту, можете мне поверить.
Я сказал всё, что хотел. Сейчас я бы вообще не стал вступать в дискуссию, если бы не заметил очевидную ошибку про то, что программа не будет работать не третьей выборке.
И может, вы всё-таки удалите этот результат? Я объяснился и извинился в письме.
// Эх, плохо помню я свой e-mail.
До меня только что дошло, что я допустил опечатку и в адресе электронной почты.
Этот — правильный.
Нежелание укреплять не самый слабый элемент цепи - это, конечно же, хорошо, но почему бы не определить простую политику безопасности?
1) Программе нельзя в явном виде получить список номинальных авторов текстов.
2) Программе запрещается общаться со внешним миром дабы избежать утечек текстов.
Насколько я понял из вышеизложенного, как минимум (1), а по комментариям и (2) не решено.
Макет решения:
cp Solution.py $P/
useradd --skel $P -G texts -m tester
unshare -n su - tester $PATH_TO_VALIDATOR | check-results
killall -9 tester
Легко расширяется до ограничений на кол-во процессов, время выполнения и т.п. в зависимости от того, насколько сильно вы готовы заморачиваться.
1) это было бы полезно, но есть следующая проблема. Оба стандартных питоновских sandbox'а трудно настроить таким образом, чтобы разрешить пользователям использовать тот же nltk (во всяком случае, сделать это за несколько дней у меня не получилось), в то же время мы хотим оставить возможность использования всех возможных библиотек, если это ничему не угражает. Поэтому мы запускаем некий наш файл main.py, который читает откуда-то тестовую выборку и скармливает её в ваш Solution.py, из-под пользователя без прав на запись и сеть. Но вот только из main.py доступ к тестовой выборке обязан быть, и как следствие Solution.py тоже его имеет. Правда, я согласен, что правильнее было бы вызывать Solution.py из-под бесправного пользователя, но тогда пришлось бы это делать на каждое произведение отдельно. В будущем так, наверное, и будет сделано
2) это давно решено, доступа к внешнему миру нет (если только не выбраться из-под пользователя, конечно)
1) Можно названия сандбоксов? Насколько мне известно, под питон в последние годы нет _ни одного_ полноценного сандбокса, в котором реально можно было бы исполнять недоверенный код. К тому же, как вы сами заявляете, очень сложно настроить песочницу для доступа к nltk, не создавая лазеек.
ИМХО гораздо проще ограничить доступ на системном уровне, что и проще, и надёжнее.
Если смысл сандбокса в том, чтобы предотвратить DDoS, можно использовать cgroups (memory)+fs quotas+rlimit (nprocs, cpu time, open files) +unshare --net и тупо убивать по killall -9 -u при зависании.
Тесты нужно давать в явном виде - спору нет. Нельзя давать _имена_ авторов, т.е. ответы не должны храниться под тем же системным пользователем, что и исполняемый solution.py.
s/DDoS/DoS/ конечно же 🙂
Ну да. Сейчас ответы вообще хранятся в фс.
Можно сделать такую процедуру: гоняем алгоритм под отдельным пользователем по списку файлов вида 1.txt 2.txt … n.txt, результат записываем в единственный доступный для записи файл out.txt. Выходим из этого пользователя, сверяем out.txt с тем, что надо.
А ещё можно посадить туда двух часовых, которые внимательно читают выхлоп лога.
А можно просто сделать регистрацию и раздавать бананы за нарушения.
Д/З: Подумать, какой из этих вариантов самый простой? Какой самый эффективный?
P. S. Совмещать можно, но регистрация нужна обязательно.