LINUX.ORG.RU

Самоподпись PHP скрипта

 , , фишка


1

1

Нужно проверить самим скриптом php по запросу браузера подлинность самого себя(т.е. файла php). Он может быть скомпрометирован (например, изменена какая-либо функция в php-файле, так что все работает, но еще делает что-то незаконное). Что-то набодобие контроля целостности самого себя... Знаю, что почти невозможно, так как и функция самопроверки может быть скомпрометирована. Есть идеи?

Нереализуемо в общем случае. В частном требует тонны обфускации и не слишком очевидно.

Лучше определись, что ты по-настоящему хочешь сделать.

x3al ★★★★★
()
Ответ на: комментарий от IvanIvan

Ок.

Нужно проверить самим скриптом php по запросу браузера подлинность самого себя
Знаю, что почти невозможно, так как и функция самопроверки может быть скомпрометирована.

Сам все прекрасно знаешь. Нужно делать безопасную установку/настройку сервера.

goingUp ★★★★★
()
Ответ на: комментарий от x3al

Как вариант...обфускация позволит скрыть алгоритм самопроверки. Но это обнаружаемо...

Что если сделать в php-файле 2 области:

шифрованная - основная часть программы;

открытая - функция расшифровки шифрованной части программы и ее последующего запуска. Ключ присылается в запросе браузера в формате location#href, чтобы не сохраняться в access-логах.

IvanIvan
() автор топика
Ответ на: комментарий от IvanIvan

Раз уж делать костыли, чем не подходит периодическая проверка содержимого php файла с удаленной нескомпроментированой машины?

goingUp ★★★★★
()
Ответ на: комментарий от IvanIvan

открытая - функция расшифровки шифрованной части программы и ее последующего запуска. Ключ присылается в запросе браузера в формате location#href, чтобы не сохраняться в access-логах.

Ты понимаешь, что это элементарно обходится небольшой обёрткой вокруг твоей функции? И что после этого можно смело сообщать «всё в порядке».

Для начала определись, от чего ты хочешь защиту.

x3al ★★★★★
()
Ответ на: комментарий от goingUp

нет ssh-доступа или чего-либо подобного

IvanIvan
() автор топика
Ответ на: комментарий от IvanIvan

Кем? Если на сервере может выполняться произвольный независимый от тебя код, то ты ничего лучше обфускации не сделаешь по определению. Можно тупо встать между твоим скриптом и http-сервером, вытащить ключ, расшифровать им твой скрипт, вытащить из него ответ/алгоритм ответа/подпись ответа и имитировать его сколько угодно. Ты ничерта с этим не сделаешь. Да, боты таким не заморачиваются, но от людей ты не защитишься.

Если нет — chmod a-w.

x3al ★★★★★
()
Ответ на: комментарий от x3al

В конце концов, определи, сколько стоит твой скрипт, во сколько обойдётся защита от взлома и сделай наконец этот chmod a-w, поскольку более надёжная защита не стоит того. Тем более что ты пытаешься сделать что-то без ssh-доступа (на копеечных php-хостингах? пытаешься продать скрипт с рекламой/чем-то ещё?).

x3al ★★★★★
()

перенести логику на отдельный сервер

доступ через API

вариант 2 (возможны связки с первым вариантом):
man phar

swwwfactory ★★
()
Последнее исправление: swwwfactory (всего исправлений: 2)
Ответ на: комментарий от x3al

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

ты не туда копаешь. Какая бы обфускация не была, всегда можно добавить в самое начало

echo "проверка выполнена! всё за*сь!"
exit;
emulek
()

Да, просто, когда начинаешь писать скрипт, вписываешь вначало его md5 и по ходу иногда сверяешься.

anonymous
()

банальный хеш?

umren ★★★★★
()
Ответ на: комментарий от emulek

Если он берёт кусок от запроса и подписывает ответ определённым ключом по хитрому алгоритму — нет. Но это длится до тех пор, пока алгоритм и ключ не вытащат.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Если он берёт кусок от запроса и подписывает ответ определённым ключом по хитрому алгоритму — нет. Но это длится до тех пор, пока алгоритм и ключ не вытащат.

про алгоритм я уже сказал: какой-то из gpg. А ключ я тебе и так скажу, к примеру 6D300475. Вот только это публичный ключ, и им можно только проверять. А подписывать надо совсем другим, которого вообще нет на сервере. Вот попробуй подделать например эту подпись, так, что-бы я не заметил, что файл изменили админы в яндексе.

Другое дело, что в случае ТСа имея доступ к пхп скрипту проверку можно банально отключить в самом скрипте.

emulek
()

просто сделай качественный скрипт, и подписывать его не прийдется

trashymichael ★★★
()

1. Подпись/проверка на основе любого алгоритма с парой ключей

2. Внедрение подписи: см. __halt_compiler

anonymous
()

а купить Zend Optimizer?
там вроде было и подпись скриптов и проверка подписи.
во всяком случае 8 лет назад вроде как это ставили для подписывания скриптов.

vtVitus ★★★★★
()
Ответ на: комментарий от x3al

Дело не в этом, хостинг не мой.

Можно тупо встать между твоим скриптом и http-сервером

Можно https наладить

ничего лучше обфускации не сделаешь

Чем обфускация поможет? Чужой код все равно сможет быть вставлен

IvanIvan
() автор топика
Ответ на: комментарий от swwwfactory

phar открывается любым текстовым редактором. Или есть в SPL функции шифрования/дешифрования файлов в файле phar - архива?

IvanIvan
() автор топика
Ответ на: комментарий от x3al

Между php-интерпретатором и сервером (т.е. апачем?) Нет.
Можно тупо встать между твоим скриптом и http-сервером

Прошу прощения, неправильно понял пред. комментарий.

Понятно что нет.

IvanIvan
() автор топика
Ответ на: комментарий от emulek

Другое дело, что в случае ТСа имея доступ к пхп скрипту проверку можно банально отключить в самом скрипте.

В этом вся соль

IvanIvan
() автор топика

Задача в общем-то состоит в следующем:

1) Клиент запрашивает php-скрипт с недоверенного сервера (по http или https)

2) Происходит проверка первозданности скрипта.

3) Если в скрипте модифицирована хоть одна функция и т.п., клиент должен узнать об этом и больше не запрашивать этот скрипт.

Можно несколько видоизменить.

1) Клиент запрашивает php-скрипт с недоверенного сервера (по http или https), при этом он передает ключ.

2) Часть скрипта зашифрована (например после __halt_compiler()), выполняется только после расшифровки по полученному ключу из нешифрованной части php-файла.

Здесь же проблема в том, что можно дописать функцию отлова клиентского ключа...

IvanIvan
() автор топика
Ответ на: комментарий от IvanIvan

Клиент запрашивает php-скрипт с недоверенного сервера (по http или https)

Если в скрипте модифицирована хоть одна функция и т.п., клиент должен узнать об этом и больше не запрашивать этот скрипт.

NoWay. Вот для HTML — можно, а для php — увы, нет.

1) Клиент запрашивает php-скрипт с недоверенного сервера (по http или https), при этом он передает ключ. 2) Часть скрипта зашифрована (например после __halt_compiler()), выполняется только после расшифровки по полученному ключу из нешифрованной части php-файла.

вредоносный скрипт прикинется хорошим, и заберёт себе секретный ключ. Не взлетит.

emulek
()

Делаем явную функцию самопроверки в самом начале скрипта, называем ее checksum_calculation() или как-нибудь так. Хакер обнаруживает ее и радостно подправляет. Откуда же ему знать, что на самом деле настоящая функция проверки сокрыта в недрах говнокода, и что он только что себя выдал? Ну а после этого уже ясно, что на серваке палево и действовать соответственно.

amomymous ★★★
()
Ответ на: комментарий от amomymous

А настоящую самопроверку скрыть в обфускации? раскрытие вопрос времени. Что-то мне подсказывает есть способ.

IvanIvan
() автор топика
Ответ на: комментарий от IvanIvan

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

amomymous ★★★
()
Ответ на: комментарий от amomymous

Это ж разновидность обфускации. Обходится точно так же: хакер может скопировать скрипт и поиграть с ним до того, как изменит оригинал.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Конечно же обходится. Идеального решения в данном случае нет. Единственное, что можно доверить такого недоверенному серверу, у которого хакер может контролировать входные данные, выходные данные, все исходники и всё окружение - это пересылать шифрованные данные от одного узла к другому, и даже это надо делать аккуратно и с умом.

amomymous ★★★
()

функция самопроверки может быть скомпрометирована

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

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

P.S. если речь идёт о защите от автоматического взлома сайтов (когда бот сканит сайты на известные уязвимости в известных CMS и заражает файлы этих CMS) то с этим можно бороться без подобных заморочек. Я например по крону раз в сутки дёргаю сервер чм-то вроде ssh myhosting find ./ -type f -exec md5 '{}' diff-ом сравниваю выхлоп со вчерашним выхлопом, если есть разница на почту мне падает письмо.
Конечно злохакер может скормить моему скрипту левые данные (подменив утилиты find или md5), но это уже требует от него ручной работы, а это медленно, так-что по факту для типового атакующего просто нет смысла заморачиваться.

MrClon ★★★★★
()

Суть сводится примерно к queen-скриптам. То есть, построению идеального хэша.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.