Имя библиотеки тут исключительно для создания уникального имени в пределах процесса. ld.so ищет файл в первую очередь по абсолютному пути, так что он сразу натыкается на псевдофайл и не грузит ничего с диска.
А вообще, самый красивый способ сделать это — написать свой ELF-загрузчик. Это не особо сложно и не зависит от внутренностей системы, но зависит от платформы. Но мне нужен был именно загрузчик в ld.so.
Запускаем программу под отладчиком, ставим бряк на open. Снимаем флаг блокировки. Ставим бряк на dlopen. Продолжаем выполнение. Меняем файл, как угодно. Продолжаем выполнение. Непроверенный код успешно загружен. Это можно даже скриптом gdb автоматизировать. Так что нет, нельзя.
А кто мешает эту самую дату изменить на любую другую? И проверить после загрузки нельзя, о чем я и написал в статье: еще до возврата из dlopen вызываются конструкторы, которые могут делать, что угодно. Например, конструктором можно пропатчить проверку, чтобы плагин прошел проверку и нормально загрузился.
Здесь моей целью было защитить программу от несанкционированного копирования и снятия ограничений, а не от подмены кода вредоносной программой. Да, я не доверяю руту. Насчет «о безопасности можно забыть»… в чем-то вы правы. Обеспечить проверку доверенности всего выполняемого кода достаточно сложно.
Для загрузки постороннего кода в приложение в линуксе есть как минимум следующие пути:
1. Банальный LD_PRELOAD. От него можно защититься, модифицировав загрузчик.
2. Подмена системных библиотек. Слинковать с библиотеками в рантайме, перед загрузкой проверяя подпись собственных копий библиотек.
3. ptrace. В качестве побочного эффекта этот код препятствует отладке, но этого недостаточно.
4. Запись через /dev/mem или /proc/../mem. От этого не защититься, поэтому надо контролировать целостность образа достаточно хитрым образом.
5. Патч исполняемого файла на диске. Контроль такой же, как в случае 4.
5. Экзотические варианты типа ядерного модуля. Ну тут уже делать нечего.
Для загрузки постороннего кода в приложение в линуксе есть как минимум следующие пути:
1. Банальный LD_PRELOAD. От него можно защититься, модифицировав загрузчик.
2. Подмена системных библиотек. Слинковать с библиотеками в рантайме, перед загрузкой проверяя подпись собственных копий библиотек.
3. ptrace. В качестве побочного эффекта этот код препятствует отладке, но этого недостаточно.
4. Запись через /dev/mem или /proc/../mem. От этого не защититься, поэтому надо контролировать целостность образа достаточно хитрым образом.
5. Патч исполняемого файла на диске. Контроль такой же, как в случае 4.
5. Экзотические варианты типа ядерного модуля. Ну тут уже делать нечего.