Prepare independently reviewed zlib-only image candidate
All checks were successful
Publish exact zlib-only remediation candidate / publish-candidate (push) Successful in 13s

Assistant: codex
Assistant-Model: gpt-6.1-sol
Assistant-Session: 01a126e1-76f8-7643-8cf3-e93336539ade
This commit is contained in:
tegwick 2026-10-11 11:36:02 +02:00
parent f0f89b6d1d
commit 9b4bb25d32
154 changed files with 29358 additions and 1 deletions

View file

@ -0,0 +1,19 @@
"""Exact public input verification only; signature verification remains mandatory in build."""
import hashlib,json,sys
from pathlib import Path
def verify(root):
pins=json.loads((root/'pins.json').read_text())
if set(pins['files'])!={'.dockerignore','Containerfile','zlib-1.3.2-r1.apk','APKINDEX.tar.gz'}:raise ValueError('unclosed inputs')
if pins['base_image']!='forgejo.coulomb.social/coulomb/informed-decision@sha256:763c36402c8be7cc4c1bd1a61623d1aff9116d52241877425b45a7018cc0883a':raise ValueError('base pin changed')
for name,digest in pins['files'].items():
p=root/name
if p.is_symlink() or not p.is_file() or p.stat().st_size>1024*1024:raise ValueError('regular bounded source required')
if hashlib.sha256(p.read_bytes()).hexdigest()!=digest:raise ValueError('changed bytes')
digest=hashlib.sha256(json.dumps(pins['files'],sort_keys=True,separators=(',',':')).encode()).hexdigest()
if digest!=pins['context_sha256']:raise ValueError('context mismatch')
return {'context_sha256':digest,'input_files':4}
if __name__=='__main__':
try:print(json.dumps(verify(Path(sys.argv[1]))))
except Exception:raise SystemExit('exact build inputs refused') from None

View file

@ -0,0 +1,29 @@
"""Package/backend/source metadata only; never opens a database or provider."""
import ctypes, gzip, hashlib, importlib.metadata, json, os
from pathlib import Path
import ssl, stat, zlib, sys
if sys.flags.optimize:raise RuntimeError("optimized smoke interpreter refused")
def digest(path):return hashlib.sha256(Path(path).read_bytes()).hexdigest()
packages={}
for entry in Path('/lib/apk/db/installed').read_text().split('\n\n'):
fields=dict(line.split(':',1) for line in entry.splitlines() if ':' in line)
if 'P' in fields:packages[fields['P']]=fields['V']
module=Path('/opt/venv/lib/python3.12/site-packages/informed_decision/policy.py');info=module.lstat()
app=module.parent
appfiles={str(p.relative_to(app)):digest(p) for p in sorted(app.rglob('*')) if p.is_file() and '__pycache__' not in p.parts}
keys={p.name:digest(p) for p in sorted(Path('/etc/apk/keys').glob('*.pub'))}
vectors=[b'',b'hello zlib',bytes(range(256))*16384,b'a'*1048576]
for value in vectors:
assert zlib.decompress(zlib.compress(value))==value
assert gzip.decompress(gzip.compress(value,mtime=0))==value
failures=0
for bad in [b'notzlib',zlib.compress(b'fixture')[:-2],b'\x00'*16]:
try:zlib.decompress(bad)
except zlib.error:failures+=1
else:raise AssertionError('malformed compression accepted')
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import jwt, waitress
key=bytes(range(32));nonce=b'123456789012';aes=AESGCM(key);cipher=aes.encrypt(nonce,b'synthetic',b'fixture');assert aes.decrypt(nonce,cipher,b'fixture')==b'synthetic'
signed=jwt.encode({'sub':'synthetic'},'synthetic-test-key-only-32bytes!!!!',algorithm='HS256');assert jwt.decode(signed,'synthetic-test-key-only-32bytes!!!!',algorithms=['HS256'])['sub']=='synthetic'
print(json.dumps({'uid':os.getuid(),'gid':os.getgid(),'policy_sha256':digest(module),'policy_mode':oct(stat.S_IMODE(info.st_mode)),'policy_uid':info.st_uid,'app_file_sha256':appfiles,'apk_packages':packages,'apk_world_sha256':digest('/etc/apk/world'),'apk_keys_sha256':keys,'python_dependencies':{d.metadata['Name']:d.version for d in importlib.metadata.distributions()},'zlib_runtime_version':zlib.ZLIB_RUNTIME_VERSION,'zlib_compile_version':zlib.ZLIB_VERSION,'libz_sha256':digest('/usr/lib/libz.so.1.3.2'),'compression_vectors_pass':len(vectors),'malformed_zlib_refusals':failures,'crypto_jwt_waitress_smoke':True,'openssl':ssl.OPENSSL_VERSION,'network_accessed':False,'database_opened':False,'provider_or_customer_data_used':False}))

View file

@ -0,0 +1,16 @@
"""Metadata only; no database, provider or native action."""
import json,sys
def compare(a,b):
for field in ('app_file_sha256','policy_sha256','policy_uid','policy_mode','uid','gid','apk_world_sha256','apk_keys_sha256','python_dependencies','openssl'):
if a[field]!=b[field]:raise ValueError('unrelated delta: '+field)
changed={name:[a['apk_packages'].get(name),b['apk_packages'].get(name)] for name in set(a['apk_packages'])|set(b['apk_packages']) if a['apk_packages'].get(name)!=b['apk_packages'].get(name)}
if changed!={'zlib':['1.3.2-r0','1.3.2-r1']}:raise ValueError('not exact zlib-only delta')
if b['policy_sha256']!='9d7c1be4cb6199d14ef0aaead5f85951f45b0ccbd7c800a7fde922a253566b62' or b['uid']!=10001 or b['gid']!=10001 or b['policy_uid']!=0 or b['policy_mode']!='0o644':raise ValueError('purpose/identity differs')
if b['compression_vectors_pass']!=4 or b['malformed_zlib_refusals']!=3 or b['crypto_jwt_waitress_smoke'] is not True:raise ValueError('backend smoke differs')
if b['database_opened'] is not False or b['network_accessed'] is not False or b['provider_or_customer_data_used'] is not False:raise ValueError('unbounded smoke scope')
return {'zlib_only_delta':True,'app_files_identical':len(b['app_file_sha256']),'no_database_or_provider':True}
if __name__=='__main__':
try:print(json.dumps(compare(json.loads(sys.argv[1]),json.loads(sys.argv[2]))))
except Exception:raise SystemExit('bounded runtime comparison refused') from None

View file

@ -0,0 +1,32 @@
import copy,importlib.util,json,tempfile,unittest,shutil
from pathlib import Path
ROOT=Path(__file__).parent
spec=importlib.util.spec_from_file_location('compare',ROOT/'compare_runtime.py');cmp=importlib.util.module_from_spec(spec);spec.loader.exec_module(cmp)
spec=importlib.util.spec_from_file_location('inputs',ROOT/'check_build_inputs.py');inputs=importlib.util.module_from_spec(spec);spec.loader.exec_module(inputs)
CASE=ROOT.parents[1]/'docs/evidence/2026-10-11-zlib-remediation-candidate'
class NarrowCandidate(unittest.TestCase):
def test_actual_single_package_delta(self):
a=json.loads((CASE/'base-runtime.json').read_text());b=json.loads((CASE/'candidate-runtime.json').read_text());self.assertTrue(cmp.compare(a,b)['zlib_only_delta'])
def test_unrelated_package_policy_identity_backend_database_python_refuse(self):
a=json.loads((CASE/'base-runtime.json').read_text());original=json.loads((CASE/'candidate-runtime.json').read_text())
for field in ('package','policy','uid','backend','database','python'):
b=copy.deepcopy(original)
if field=='package':b['apk_packages']['musl']='different'
elif field=='policy':b['policy_sha256']='0'*64
elif field=='uid':b['uid']=0
elif field=='backend':b['malformed_zlib_refusals']=0
elif field=='database':b['database_opened']=True
else:b['python_dependencies']['PyJWT']='different'
with self.subTest(field=field),self.assertRaises(ValueError):cmp.compare(a,b)
def test_mutated_package_or_index_refuse(self):
source=ROOT.parents[1]/'deploy/zlib-overlay'
for name in ('zlib-1.3.2-r1.apk','APKINDEX.tar.gz'):
with tempfile.TemporaryDirectory() as directory:
root=Path(directory)/'context';shutil.copytree(source,root);p=root/name;p.write_bytes(p.read_bytes()+b'changed')
with self.assertRaises(ValueError):inputs.verify(root)
def test_closed_recipe(self):
source=ROOT.parents[1]/'deploy/zlib-overlay';self.assertEqual(inputs.verify(source)['input_files'],4)
text=(source/'Containerfile').read_text()
for fragment in ('--no-preupgrade','--no-logfile','--no-network','--repositories-file /dev/null','--repository /tmp/infd-zlib zlib'):self.assertIn(fragment,text)
self.assertNotIn('--allow-untrusted',text)
if __name__=='__main__':unittest.main()