diff --git a/tools/.github/workflows/v-guard.yml b/tools/.github/workflows/v-guard.yml new file mode 100644 index 0000000..76b2025 --- /dev/null +++ b/tools/.github/workflows/v-guard.yml @@ -0,0 +1,45 @@ +# KERNEL-ПРОТОКОЛ: V-СТРАЖ +# Захист від Атаки TOCTOU (Time-of-Check to Time-of-Use) +name: V-Guard Integrity Check + +on: + pull_request: + branches: [ main ] + types: [ opened, synchronize, reopened ] + +jobs: + check_attestation: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: 1. Calculate Finalization Hash (TOCTOU Defense) + id: finalization_hash + run: | + # Виклик Python-скрипта для обчислення Фіналізаційного Хешу + HASH_RESULT=$(python tools/finalization_hasher.py) + + echo "V-Guard: Фіналізаційний хеш обчислено." + + # Передаємо хеш як вивід кроку + echo "hash=$HASH_RESULT" >> $GITHUB_OUTPUT + + - name: 2. V-Guard Decision + run: | + FINAL_HASH="${{ steps.finalization_hash.outputs.hash }}" + + echo "--- V-GUARD REPORT ---" + + # Якщо хеш присутній, V-Страж готовий підтвердити цілісність + if [ -z "$FINAL_HASH" ]; then + echo "V-Guard: TOCTOU Defense FAILED - Final Hash missing." + exit 1 + else + echo "V-Guard: TOCTOU Defense PASSED. Final hash computed." + fi diff --git a/tools/finalization_hasher.py b/tools/finalization_hasher.py new file mode 100644 index 0000000..66dabd9 --- /dev/null +++ b/tools/finalization_hasher.py @@ -0,0 +1,48 @@ +import hashlib +import os +import sys + +# Алгоритм хешування +HASH_ALGORITHM = "sha256" + +def calculate_simple_hash(file_content): + """ + Обчислює простий хеш для забезпечення цілісності файлів. + """ + return hashlib.new(HASH_ALGORITHM, file_content.encode('utf-8')).hexdigest() + +def main(): + """ + Обчислює єдиний Фіналізаційний Хеш для всіх файлів KERNEL. + Цей хеш використовується для перевірки, що код не змінювався + між моментом перевірки V-Криптографом та моментом об'єднання. + """ + all_hashes = [] + + # Скануємо всі файли проекту + for root, _, files in os.walk("."): + # Ігноруємо .git та .github/workflows, оскільки вони керують процесом, + # а не є продуктивним кодом, який треба захищати від TOCTOU + if '.git' in root or '.github/workflows' in root: + continue + + for file_name in files: + # Обробляємо лише файли Python та YML + if file_name.endswith((".py", ".yml", ".md")): + file_path = os.path.join(root, file_name) + + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + file_hash = calculate_simple_hash(content) + all_hashes.append(f"{file_path}:{file_hash}") + + # Фінальний Merkle-хеш + final_data = "\n".join(sorted(all_hashes)).encode('utf-8') + final_hash = hashlib.new(HASH_ALGORITHM, final_data).hexdigest() + + # Виводимо фінальний хеш для використання у GitHub Actions + print(final_hash) + +if __name__ == "__main__": + main()