Bug 40621

Summary: Enable RPM signature verification
Product: Sisyphus Reporter: Vitaly Chikunov <vt>
Component: rpmAssignee: placeholder <placeholder>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: alexey.tourbin, at, glebfm, imz, iv, lav, ldv, manowar, placeholder, vt
Version: unstable   
Hardware: x86   
OS: Linux   

Description Vitaly Chikunov 2021-07-31 03:04:44 MSK
Сейчас проверка подписей отключена, на сколько я понимаю (возможно ошибаюсь), из-за того, что у нас ключи хранятся в другом месте - не в базе rpm в виде псевдо-пакетов.

Предлагаю сделать поддержку нашего местоположения ключей и включить проверку подписей в RPM пакетах.
Comment 1 alexey.tourbin 2021-07-31 11:19:51 MSK
Verifying individual signatures is redundant.  When you update from a repo, its release file is signed.  The release file references pkglist, and pkglist references individual packages.  Since those references must be cryptographically-strong, there is no point in verifying the signatures of each individual package.  The top-level signature covers it all.

As an analogy, in git, you don't sign individual blobs.
Comment 2 Vitaly Chikunov 2021-09-20 03:00:40 MSK
Есть, как минимум, два не покрытых сценария.
1) Инсталляция в обход `apt-get` через `rpm -i`. Например, в `epm` используется `rpm -U`.
2) Желание пользователя подтвердить принадлежность скачанного когда-то или откуда-то rpm'а. Коме того, если пакет в репозитории обновился, то pkglist уже не ссылается на этот rpm.
Comment 3 Dmitry V. Levin 2021-09-21 18:58:49 MSK
(In reply to Vitaly Chikunov from comment #2)
> Есть, как минимум, два не покрытых сценария.

Наверняка найдутся и другие редкие сценарии.
Например, для girar я сделал обёртку под названием alt-rpmkeys-checksig, которая поддерживает и rpm-4.0.4, и более новый rpm.

> 1) Инсталляция в обход `apt-get` через `rpm -i`.

Есть много способов испортить себе систему в обход `apt-get`.
Просто не надо использовать `rpm -i` для обработки untrusted input.

> Например, в `epm` используется `rpm -U`.

В таком случае `epm` должен обеспечивать проверку того, что отдаётся на вход `rpm -U`.

> 2) Желание пользователя подтвердить принадлежность скачанного когда-то или
> откуда-то rpm'а. Коме того, если пакет в репозитории обновился, то pkglist
> уже не ссылается на этот rpm.

Пользователи, желающие странного, найдут способ этого добиться.
Comment 4 Vitaly Lipatov 2022-03-18 12:18:54 MSK
(Ответ для Dmitry V. Levin на комментарий #3)
> (In reply to Vitaly Chikunov from comment #2)
> > Есть, как минимум, два не покрытых сценария.
> 
> Наверняка найдутся и другие редкие сценарии.
> Например, для girar я сделал обёртку под названием alt-rpmkeys-checksig,
> которая поддерживает и rpm-4.0.4, и более новый rpm.
> 
> > 1) Инсталляция в обход `apt-get` через `rpm -i`.
> 
> Есть много способов испортить себе систему в обход `apt-get`.
> Просто не надо использовать `rpm -i` для обработки untrusted input.
> 
> > Например, в `epm` используется `rpm -U`.
> 
> В таком случае `epm` должен обеспечивать проверку того, что отдаётся на вход
> `rpm -U`.
Как я понимаю, что сейчас мы имеем только доверие к репозиторию, это проверка на уровне apt.
То есть подпись самого пакета не проверяется ни в каком случае.
Существует ли способ включить для rpm эту проверку, чтобы можно было устанавливать доверенные пакеты,
поставляемые вне репозиториев? 

То есть тут речь о сторонних поставщиках решений для ALT.
Comment 5 manowar@altlinux.org 2024-08-06 17:28:18 MSK
(Ответ для Vitaly Lipatov на комментарий #4)
> Существует ли способ включить для rpm эту проверку, чтобы можно было
> устанавливать доверенные пакеты,
> поставляемые вне репозиториев? 

Похоже, что для этого достаточно обнулить тег %__vsflags (записать туда 0x00000),
и выставить ещё один тег --- %_keyringpath (например, в /var/lib/rpm),
а затем по этому пути положить один или несколько файлов *.key,
с публичными ключами в формате PGP (GPG). Они у нас лежат в пакете
alt-gpgkeys. После этого программа rpmverify начинает работать как
ожидается. Причём, в режиме -vv показывает информацию о контрольных
суммах и подписях, результатах их проверки.

# tail -n +486 /usr/lib/rpm/macros | head -2
%__vsflags		0x00000
%_keyringpath		/var/lib/rpm

gpg --import /usr/lib/alt-gpgkeys/pubring.gpg

gpg --armor --export ff979dedda2773bb >/var/lib/rpm/alt-sisyphus.key

# /usr/bin/rpmverify -vv zlib
...
D: loading keyring from pubkeys in /var/lib/rpm/*.key
ufdio:       1 reads,     2407 total bytes in 0.000002 secs
D: added key /var/lib/rpm/alt-sisyphus.key to keyring
D:  read h#     231 Заголовок V4 RSA/SHA512 Signature, key ID da2773bb: OK
D: ========== +++ zlib-1.3.1-alt1 x86_64/linux 0x0
D:  read h#      75 Заголовок V4 RSA/SHA512 Signature, key ID da2773bb: OK
D:  Requires: libc.so.6(GLIBC_2.14)(64bit)                  ДА (db provides)
D:  Requires: libc.so.6(GLIBC_2.2.5)(64bit)                 ДА (db provides)
D:  Requires: libc.so.6(GLIBC_2.3.4)(64bit)                 ДА (db provides)
D:  Requires: libc.so.6(GLIBC_2.4)(64bit)                   ДА (db provides)
D:  Requires: rtld(GNU_HASH)                                ДА (db provides)
D:  Requires: rpmlib(PayloadIsLzma)                         ДА (rpmlib provides)
D: Conflicts: libxml2 < 1:2.7.7                             НЕT 
.........    /lib64/libz.so.1
ufdio:       2 reads,   117312 total bytes in 0.000096 secs
.........    /lib64/libz.so.1.3.1
.........    /usr/share/doc/zlib-1.3.1
ufdio:       2 reads,     1002 total bytes in 0.000290 secs
.........  d /usr/share/doc/zlib-1.3.1/LICENSE
ufdio:       2 reads,     5317 total bytes in 0.000205 secs
.........  d /usr/share/doc/zlib-1.3.1/README
...