Как получить переменные локали для любого процесса?

Вы правильно поняли. «Ring 0» - это термин x86 для режима ядра процессора. «Запуск в кольце 0» означает «код ядра».

С точки зрения безопасности, все, что может быть сделано процессом (под любым UID), может быть выполнено ядром. Некоторые вещи очень неудобно делать из кода ядра, например, открывать файл, но они возможны.

И наоборот, при нормальных обстоятельствах, если вы можете запускать код с UID 0, вы можете запускать код ядра, загружая модуль ядра. Таким образом, в типичной конфигурации нет барьера безопасности между UID 0 и уровнем ядра. Однако код, выполняющийся в процессе, по-прежнему связан ограничениями пользовательского режима процессора: каждый доступ к периферийному устройству (включая диски, сеть и т. Д.) По-прежнему должен осуществляться через системный вызов.Можно настроить машину на использование UID 0, который не является всем мощным, например:

  • Отключить загрузку модулей ядра.
  • Используйте структуру безопасности , такую ​​как SELinux , чтобы отобрать привилегии у процесса: UID 0 не обязательно превосходит их, например, можно создать гостевую учетную запись с UID 0 но по существу никаких привилегий с правильной политикой SELinux.
  • UID 0 в пространстве имен пользователя имеет разрешения только создателя пространства имен.

1
12.06.2018, 07:38
2 ответа

Con GNU xargsen Linux:

xargs -r0a "/proc/$pid/environ" sh -c 'exec env -i -- "$@" locale' sh

Ejecutaría localeen una copia del entorno, el proceso de pid $pidpasó al comando que ejecutó por última vez.

Tenga en cuenta que localeal ser externo, solo se preocupa por las variables de entorno, no por las variables de shell si no se han exportado.

El propio shell puede verse afectado por su configuración de localización incluso si las variables LC_*, LANG, LANGUAGEno se exportan.

Algunas notas de precaución:

  • Los programas que utilizan la localización suelen hacer un setlocale(LC_ALL, "")para inicializar todas sus configuraciones de localización en función del entorno, pero no es necesario.
  • Pueden llamar setlocale()con diferentes parámetros (improbable ).
  • Pueden llamarlo antes o después de modificar su entorno (con API como putenv()/setenv()).
  • Esos putenv()/ setenv()tradicionalmente no modifican el área expuesta por /proc/$pid/environpero IIRC está cambiando en versiones recientes de Linux y GNU libc.
  • Independientemente de esos putenv()/ setenv(), el proceso puede terminar modificando su área de la pila expuesta por/proc/$pid/environ(poco probable ).

Otra opción sería adjuntar gdb al proceso y hacer:

call system("locale")

Sin embargo, eso es bastante intrusivo.

Ese usaría el entorno preparado por el propio proceso (asumiendo que usa environy/o putenv()/ setenv()que no todas las aplicaciones, especialmente los shells, por ejemplo, hacen ).

Con gdb, también podría consultar la configuración de localización directamente llamando a setlocale()para cada categoría de configuración regional con un segundo argumento NULL.

Para conocer el valor de una determinada categoría:

$ printf '#include <locale.h>\nLC_COLLATE\n' | gcc -E -x c - | tail -n 1
3

Para imprimir el nombre de la configuración regional engdb:

(gdb) p (char*)setlocale(3, 0)
$3 = 0xde8f40 "en_GB.UTF-8"

o:

(gdb) x/s setlocale(3, 0)
0xde8f40:       "en_GB.UTF-8"
3
27.01.2020, 23:32

Даже в оболочке вызов localeне всегда дает надежные результаты.

Оболочка Борна, например. импортирует переменные среды в локальные переменные оболочки и пересылает импортированные значения своим дочерним элементам, но в то же время позволяет изменять связанные локальные переменные без изменения экспортируемого значения. Настройка локали Bourne Shell основана на внутренних значениях переменных оболочки, а не на импортированной или экспортированной среде.

Поскольку это относится к переменным LC _*, оболочка Bourne может работать в другом языковом стандарте, чем сообщает команда locale. Кстати, :вы можете изменить это, вызвав set -o posixв оболочке Bourne... чтобы указать оболочке Bourne синхронизировать экспортированные значения из импортированных переменных с внутренним значением.

Даже больше :Начиная с POSIX.1 -2008, существует способ разрешить программе использовать несколько языков одновременно. Это напр. важно для компиляторов, которые любят анализировать, например. константы с плавающей запятой в локали Cдля США, где используется необычный разделитель дробей с плавающей запятой '.' используется, но по-прежнему выдает предупреждения и другие выходные данные, основанные на другой локали.

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

Как видите, просмотр окружения других программ может дать лишь приблизительное представление о том, какой может быть локаль, но никогда не возвращает истинных разрешенных результатов.

0
27.01.2020, 23:32

Теги

Похожие вопросы