Как разрешить приложение на основе Java привязать к низкому порту

Поскольку документация POSIX допускает его как расширение, ничто не препятствует реализации такого поведения.

Простая проверка (выполняется в zsh ):

$ for shell in /bin/*sh 'busybox sh'; do
    printf '[%s]\n' $shell
    $=shell -c 'á() { :; }'
  done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name

показывают, что bash , zsh , yash , ksh93 (который ksh связан в моей системе), pdksh и его производные допускают использование многобайтовых символов в качестве имени функции.

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

Другая документация, на которую вы можете ссылаться: ksh93 :

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

Таким образом, установка на C locale:

$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name

приводит к сбою.

3
05.07.2018, 17:12
2 ответа

Если бы вы могли дать java (или чему-то, что использует динамические библиотеки ), повышенные возможности, то злоумышленник мог бы переключить библиотеки, чтобы получить возможности.

Решение

Напишите минимальную программу на C (со статической компоновкой ), откройте порт и прикрепите ее к файловому дескриптору 3. Затем выполните программу Java. Программа Java должна будет выполнить fdopen, чтобы он выглядел как файл с точки зрения Java (open "/dev/fd/3"). Этой оболочке потребуются возможности.

1
27.01.2020, 21:25

Существует множество решений, которые вы можете перечислить здесь, так как вы используете systemd, кажется, это правильный путь, используяListenStream:

$ cat /etc/systemd/system/gitea.socket
[Unit]
Description=Gitea socket

[Socket]
ListenStream=80
NoDelay=true

И затем, как только вы определили свой .socketфайл, определите свой юнит-файл таким образом, используя его:

[Unit]
Description=Gitea (Git with a cup of tea)
Requires=gitea.socket
After=syslog.target
After=network.target
After=postgresql.service

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/go/src/code.gitea.io/gitea
ExecStart=/home/git/go/src/code.gitea.io/gitea/gitea web
Restart=always
Environment=USER=git HOME=/home/git
NonBlocking=true

[Install]
WantedBy=multi-user.target

Ссылки

1
27.01.2020, 21:25

Теги

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