Bug 54786 - percona-xtrabackup80: Аварийный останов (assertion failed) при неправильной длине ключа для расшифрования
Summary: percona-xtrabackup80: Аварийный останов (assertion failed) при неправильной д...
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: percona-xtrabackup80 (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Alexei Takaseev
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2025-06-11 11:55 MSK by Artem Varaksa
Modified: 2025-06-16 11:09 MSK (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2025-06-11 11:55:29 MSK
Шаги
====

Настроить MySQL и попробовать создать зашифрованный, а затем расшифровать бекап с неправильной длиной ключа (32, нужно 16):

# LENGTH=32 && \
  set -o pipefail && \
  apt-get install -y percona-xtrabackup80 && \
  rm -rvf /var/lib/mysql/ && apt-get install -y --reinstall MySQL perl-DBD-mysql && \
  chkconfig mysqld on && \
  systemctl enable --now mysqld ; sleep 2 ; systemctl status --no-pager mysqld && \
  control mysqld-chroot disabled && systemctl restart mysqld ; sleep 2 ; systemctl status --no-pager mysqld && \
  echo create database test | mysql && \
  mkdir -p /data/backups && \
  key="$(openssl rand -base64 -hex "$LENGTH")" && \
  xtrabackup --backup --encrypt=AES256 --encrypt-key="${key}" --datadir=/var/lib/mysql/db --target-dir=/data/backups/encrypt; \
  for i in $(find /data/backups/encrypt/ -iname "*\.xbcrypt"); do xbcrypt -d --encrypt-key="${key}" --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm -fv $i; done


Фактический результат
=====================

Создание резервной копии не успешное из-за неправильной длины ключа и программа выходит с 1, но не падает.

> encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length

А расшифровка ещё и падает на assert:

> encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length
> Assertion "0" failed at /usr/src/RPM/BUILD/percona-xtrabackup80-8.0.35/storage/innobase/xtrabackup/src/ds_decrypt.cc:48
> Аварийный останов


Ожидаемый результат
===================

Нет падения на assert.


Воспроизводимость
=================

Воспроизводится на виртуальных машинах:

[sisyphus] ALT Server 11.0 beta20250213 x86_64
percona-xtrabackup80-8.0.35-alt5.x86_64

[p11] ALT Server 11.0 beta20250213 x86_64
percona-xtrabackup80-8.0.35-alt4.x86_64
Comment 1 Alexei Takaseev 2025-06-12 07:48:20 MSK
Ошибка в тесте, в конструкции LENGTH=32 && key="$(openssl rand -base64 -hex "$LENGTH")" в переменной $key будет значение длинной 64 символа (то есть 512 бит, поэтому и сообщение о длине ключа). Если же в LENGTH указать 16, то значение будет 32 символа (256 бит) и приведенный выше скрипт отрабатывает успешно.
Comment 2 Artem Varaksa 2025-06-16 10:23:30 MSK
Да, ошибка сделана специально. Проблема в разнице поведение шифрования и дешифрования - при шифровании хоть и отображается та же ошибка (ожидаемо), программа не падает с аварийным остановом.

Аварийный останов / assert предполагает ситуацию, которая не была предусмотрена в программе, но исходя из отображаемой ошибки, она предусмотрена - но код её обработки почему-то не выходит сразу из программы, поэтому позже и падает на assert.
Comment 3 Alexei Takaseev 2025-06-16 11:09:12 MSK
(Ответ для Artem Varaksa на комментарий #2)
> Да, ошибка сделана специально. Проблема в разнице поведение шифрования и
> дешифрования - при шифровании хоть и отображается та же ошибка (ожидаемо),
> программа не падает с аварийным остановом.
> 
> Аварийный останов / assert предполагает ситуацию, которая не была
> предусмотрена в программе, но исходя из отображаемой ошибки, она
> предусмотрена - но код её обработки почему-то не выходит сразу из программы,
> поэтому позже и падает на assert.

Это ожидаемое поведение, заложенное разработчиками.