2025 Summer Challenge: OCInception

Rédigé par Timothée Schneider-Maunoury - 21/07/2025 - dans Challenges - Téléchargement

Le dernier Summer Challenge de Synacktiv a eu lieu en 2019, et après 6 ans, il est de retour. Envoyez-nous votre solution avant la fin du mois d'août, il y a des défis à relever et des prix à gagner ! Ce challenge s'inspire du code golfing, où l'objectif est de produire le plus petit programme implémentant une fonctionnalité. Mais cette fois, il s'agira de créer la plus petite archive d'image Podman auto-réplicative...

Vous souhaitez améliorer vos compétences ? Découvrez nos sessions de formation ! En savoir plus

🏆 Les prix

Voici les prix pour les trois premiers participants :

  1. première place : un beau clavier mécanique Keychron Q1 Max, layout UK-ISO et un câble Keychron,
  2. deuxième place : un starter kit Raspberry Pi5 avec 16GO de RAM : de quoi faire tourner tous les conteneurs que vous pourriez vouloir utiliser,
  3. troisième place : un sac Rootme pour transporter votre ordinateur portable.

 

📜 Le script de test

Pour être validée, votre archive doit être une image capable de générer une autre image, qui à son tour en générera une autre, et ainsi de suite ! On peut voir ça comme un programme auto-réplicatif ou Quine, mais dans une version OCI !

Vous devez créer une archive nommée ocinception_<nickname>.tar qui passe sans erreur le script de test suivant :

#!/bin/bash
set -e

# Check args
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 <nickname> <loop_count>"
    echo "Give the nickname matching your archive name, and the number of test iterations."
    exit 1
fi

# Check if nickname is not an empty string
if [ -z "$1" ]; then
    echo "Error: nickname arg must not be an empty string."
    exit 1
fi

# Check if loop_count is > 0
if [ "$2" -le 0 ]; then
    echo "Error: loop_count arg must be greater than 0."
    exit 1
fi

INPUT_ARCHIVE_NAME="ocinception_$1.tar"
IMAGE_NAME=ocinception_$1
FINAL_ARCHIVE_NAME="final_${INPUT_ARCHIVE_NAME}"
LOOP_COUNT=$2
MAX_RUN_TIME=8
PODMAN_RUN_OPTIONS=(--network=none --rm --rmi)

#### This command will be run before each test,
#### but it is commented to prevent you from accidentally resetting your entire Podman system
# podman system reset --force

# Load and tag initial podman image
podman load --quiet --input "$INPUT_ARCHIVE_NAME"
current_random_tag=$(head -c 32 /dev/urandom | sha256sum | awk '{print $1}')
podman tag "$IMAGE_NAME:latest" "$IMAGE_NAME:$current_random_tag"

# Podmanception loop
for ((i = 0; i < LOOP_COUNT; i++)); do
    previous_random_tag=$current_random_tag
    current_random_tag=$(head -c 32 /dev/urandom | sha256sum | awk '{print $1}')

    timeout "$MAX_RUN_TIME" podman run "${PODMAN_RUN_OPTIONS[@]}" "$IMAGE_NAME:$previous_random_tag" "$current_random_tag" > "$FINAL_ARCHIVE_NAME"
    podman load --quiet --input "$FINAL_ARCHIVE_NAME" | grep --color "$current_random_tag"
done
podman rmi "$IMAGE_NAME:$current_random_tag" > /dev/null

# Print your score
stat --printf="🦭 Well done little seal! Your score: %s 🦭\n" "$FINAL_ARCHIVE_NAME"

 

📤 Comment participer ?

Pour proposer une solution, envoyez l'archive à l'adresse summer-challenge@synacktiv.com.

  1. Le challenge se déroulera pendant le mois d'août et le rapport sera publié en septembre.
  2. N'hésitez pas à nous envoyer vos solutions au fur et à mesure de votre progression, vous pouvez en soumettre autant que vous le souhaitez.
  3. Une fois la proposition reçue et validée, le classement général sera mis à jour, mais les scores ne seront pas divulgués.
  4. Si vous avez un doute sur la validité d'une solution ou une question sur le règlement, vous pouvez nous envoyer un mail.

 

📋 Les règles en détails

  1. Le gagnant sera celui qui aura le plus petit score calculé et affiché par le script de test.
  2. Le script de test est fixe, vous devez optimiser votre solution pour obtenir le meilleur score !
  3. Les tests peuvent être exécutés avec n'importe quelle valeur de loop_count (supérieure à 0).
  4. Si un score peut varier d'une exécution à l'autre, une moyenne sera calculée.
  5. Le script sera exécuté sur une VM Debian 12 sans accès internet.
  6. Sur cette VM, podman version 4.3.1 avec un storage overlay est installé, ainsi que tous les outils de compression dont vous pourriez avoir besoin : tar, gzip, bzip2, etc.

 

🥷🏼 Bonus

En interne, nous avons déjà développé une solution particulièrement optimisée.
Serez-vous capable de battre Synacktiv ainsi que tous les autres participants ?
Pour éviter de vous donner le résultat de cette solution, ce qui constituerait un bon indice, voici le hash d'un fichier texte qui révèle notre score : c795ecf7692319832a62567ebdca26f4a7128197185bb019a1a139ad3b37ca58.
Le fichier sera publié dans le writup de ce challenge.
 
 Les solutions seront acceptées jusqu'au 31 août à 23h59. Êtes-vous prêt à plonger dans les plus sombres secrets des archives OCI ?

 

Bonne chance à tous les participants !