libmakepkg: reproducibilty for python packages

Arch Linux has been setting PYTHONHASHSEED=0 to create deterministic
.pyc files.  After a thorough review by the Arch Security Team, setting
this variable was determined not to generated vulnerable .pyc files, as
when the loader loads the .pyc file and unmarshalls it, the internal
runtime will just populate the unordered data structures and use a new
runtime hash for them.

Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Allan McRae 2021-08-08 22:49:32 +10:00
parent fc7986485c
commit 1c5a56884f
4 changed files with 76 additions and 0 deletions

View file

@ -5,6 +5,7 @@ libmakepkg_modules = [
{ 'name' : 'lint_config', 'has_subdir' : true }, { 'name' : 'lint_config', 'has_subdir' : true },
{ 'name' : 'lint_package', 'has_subdir' : true }, { 'name' : 'lint_package', 'has_subdir' : true },
{ 'name' : 'lint_pkgbuild', 'has_subdir' : true }, { 'name' : 'lint_pkgbuild', 'has_subdir' : true },
{ 'name' : 'reproducible', 'has_subdir' : true },
{ 'name' : 'source', 'has_subdir' : true }, { 'name' : 'source', 'has_subdir' : true },
{ 'name' : 'srcinfo', }, { 'name' : 'srcinfo', },
{ 'name' : 'tidy', 'has_subdir' : true }, { 'name' : 'tidy', 'has_subdir' : true },

View file

@ -0,0 +1,29 @@
#!/bin/bash
#
# reproducible.sh - utilities for improving package reproducibility
#
# Copyright (c) 2021 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_REPRODUCIBLE_SH" ]] && return
LIBMAKEPKG_REPRODUCIBLE_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
for lib in "$LIBRARY/reproducible/"*.sh; do
source "$lib"
done

View file

@ -0,0 +1,17 @@
libmakepkg_module = 'reproducible'
sources = [
'python.sh.in',
]
foreach src : sources
output_dir = join_paths(get_option('datadir'), 'makepkg', libmakepkg_module)
custom_target(
libmakepkg_module + '_' + src.underscorify(),
command : [ SCRIPT_EDITOR, '@INPUT@', '@OUTPUT@' ],
input : src,
output : '@BASENAME@',
install : true,
install_dir : output_dir)
endforeach

View file

@ -0,0 +1,29 @@
#!/bin/bash
#
# python.sh - creating reproducible python packages
#
# Copyright (c) 2021 Pacman Development Team <pacman-dev@archlinux.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[[ -n "$LIBMAKEPKG_REPRODUCIBLE_PYTHON_SH" ]] && return
LIBMAKEPKG_REPRODUCIBLE_PYTHON_SH=1
LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
# disable hash randomization when creating .pyc files
export PYTHONHASHSEED=0