test: add block AE — Go language invoke test
This commit is contained in:
+117
@@ -678,6 +678,123 @@ Z_VICTIM_LIST=$(curl -s ${BASE}/functions -H "X-Test-Sub: ${VICTIM_USER}" \
|
||||
| python3 -c "import sys,json; fns=json.load(sys.stdin); print(sum(1 for f in fns if f['metadata']['name']=='secret-fn'))" 2>/dev/null)
|
||||
[ "${Z_VICTIM_LIST:-0}" -eq 1 ] && pass "Cross-user: функция жертвы цела после атаки" || fail "Cross-user: функция жертвы исчезла!"
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
echo ""
|
||||
echo ">>> БЛОК AA: PHP — создание и вызов"
|
||||
|
||||
# Все три блока (AA/AB/AC) используют ОДИН namespace, чтобы избежать повторных executor rollouts.
|
||||
# Первая функция (PHP) вызывает addNSToFission → executor rollout (~60s).
|
||||
# Ruby и Perl создаются в том же namespace → rollout не нужен → пулы стартуют сразу.
|
||||
LANG_NS="lang-multi-${RUN_ID}@test.local"
|
||||
|
||||
PHP_CODE=$(python3 -c "import json; print(json.dumps('<?php\nfunction handler(\$context) {\n \$context[\"response\"]->getBody()->write(\"php-ok\");\n}'))")
|
||||
R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \
|
||||
-H "X-Test-Sub: ${LANG_NS}" -H "Content-Type: application/json" \
|
||||
-d "{\"name\":\"php-fn\",\"language\":\"php\",\"code\":${PHP_CODE},\"ttl\":\"10m\"}")
|
||||
CODE=$(echo "$R" | tail -1)
|
||||
check_http "$CODE" "201" "PHP: create → 201"
|
||||
|
||||
# Ждём пока poolmgr поднимет pod для нового env (retry до 200s).
|
||||
# После executor rollout (~60s) + startup pod (~30s) = ~90s до первого invoke.
|
||||
STATUS=""; RAW=""
|
||||
for _try in $(seq 1 20); do
|
||||
sleep 10
|
||||
INV=$(curl -s -X POST ${BASE}/functions/php-fn/invoke \
|
||||
-H "X-Test-Sub: ${LANG_NS}")
|
||||
STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null)
|
||||
RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null)
|
||||
[ "$STATUS" = "200" ] && break
|
||||
done
|
||||
[ "$STATUS" = "200" ] && pass "PHP: invoke → 200" || fail "PHP: invoke → got $STATUS (body: $RAW)"
|
||||
echo "$RAW" | grep -q "php-ok" && pass "PHP: тело содержит php-ok" || fail "PHP: тело не содержит php-ok (got: $RAW)"
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
echo ""
|
||||
echo ">>> БЛОК AB: Ruby — создание и вызов"
|
||||
|
||||
RUBY_CODE=$(python3 -c "import json; print(json.dumps('def handler\n \"ruby-ok\"\nend'))")
|
||||
R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \
|
||||
-H "X-Test-Sub: ${LANG_NS}" -H "Content-Type: application/json" \
|
||||
-d "{\"name\":\"ruby-fn\",\"language\":\"ruby\",\"code\":${RUBY_CODE},\"ttl\":\"10m\"}")
|
||||
CODE=$(echo "$R" | tail -1)
|
||||
check_http "$CODE" "201" "Ruby: create → 201"
|
||||
|
||||
# Ждём пока poolmgr поднимет pod (retry до 200s).
|
||||
# Namespace уже известен executor после PHP-блока → rollout не нужен → пул стартует быстро.
|
||||
STATUS=""; RAW=""
|
||||
for _try in $(seq 1 20); do
|
||||
sleep 10
|
||||
INV=$(curl -s -X POST ${BASE}/functions/ruby-fn/invoke \
|
||||
-H "X-Test-Sub: ${LANG_NS}")
|
||||
STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null)
|
||||
RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null)
|
||||
[ "$STATUS" = "200" ] && break
|
||||
done
|
||||
[ "$STATUS" = "200" ] && pass "Ruby: invoke → 200" || fail "Ruby: invoke → got $STATUS (body: $RAW)"
|
||||
echo "$RAW" | grep -q "ruby-ok" && pass "Ruby: тело содержит ruby-ok" || fail "Ruby: тело не содержит ruby-ok (got: $RAW)"
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
echo ""
|
||||
echo ">>> БЛОК AC: Perl — создание и вызов"
|
||||
|
||||
PERL_CODE=$(python3 -c "import json; print(json.dumps('sub {\n return \"perl-ok\";\n}'))")
|
||||
R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \
|
||||
-H "X-Test-Sub: ${LANG_NS}" -H "Content-Type: application/json" \
|
||||
-d "{\"name\":\"perl-fn\",\"language\":\"perl\",\"code\":${PERL_CODE},\"ttl\":\"10m\"}")
|
||||
CODE=$(echo "$R" | tail -1)
|
||||
check_http "$CODE" "201" "Perl: create → 201"
|
||||
|
||||
# Ждём пока poolmgr поднимет pod (retry до 200s).
|
||||
# Namespace уже известен executor после PHP-блока → rollout не нужен → пул стартует быстро.
|
||||
STATUS=""; RAW=""
|
||||
for _try in $(seq 1 20); do
|
||||
sleep 10
|
||||
INV=$(curl -s -X POST ${BASE}/functions/perl-fn/invoke \
|
||||
-H "X-Test-Sub: ${LANG_NS}")
|
||||
STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null)
|
||||
RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null)
|
||||
[ "$STATUS" = "200" ] && break
|
||||
done
|
||||
[ "$STATUS" = "200" ] && pass "Perl: invoke → 200" || fail "Perl: invoke → got $STATUS (body: $RAW)"
|
||||
echo "$RAW" | grep -q "perl-ok" && pass "Perl: тело содержит perl-ok" || fail "Perl: тело не содержит perl-ok (got: $RAW)"
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
echo ""
|
||||
echo ">>> БЛОК AD: Невалидный язык → 400"
|
||||
|
||||
R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \
|
||||
-H "X-Test-Sub: lang-inv-${RUN_ID}@test.local" -H "Content-Type: application/json" \
|
||||
-d '{"name":"bad-lang-fn","language":"cobol","code":"x"}')
|
||||
CODE=$(echo "$R" | tail -1)
|
||||
check_http "$CODE" "400" "Невалидный язык cobol → 400"
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
echo ""
|
||||
echo ">>> БЛОК AE: Go — создание и вызов"
|
||||
|
||||
# Go использует newdeploy executor + buildermgr (~60-90s на сборку).
|
||||
# Используем отдельный namespace чтобы не ждать executor rollout.
|
||||
GO_NS="go-${RUN_ID}@test.local"
|
||||
GO_CODE=$(python3 -c "import json; print(json.dumps('package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n)\n\nfunc Handler(w http.ResponseWriter, r *http.Request) {\n\tfmt.Fprintf(w, \"go-ok\")\n}'))")
|
||||
R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \
|
||||
-H "X-Test-Sub: ${GO_NS}" -H "Content-Type: application/json" \
|
||||
-d "{\"name\":\"go-fn\",\"language\":\"go\",\"code\":${GO_CODE},\"ttl\":\"10m\"}")
|
||||
CODE=$(echo "$R" | tail -1)
|
||||
check_http "$CODE" "201" "Go: create → 201"
|
||||
|
||||
# Retry до 240s (24 итерации × 10s): ждём сборку + запуск newdeploy pod.
|
||||
STATUS=""; RAW=""
|
||||
for _try in $(seq 1 24); do
|
||||
sleep 10
|
||||
INV=$(curl -s -X POST ${BASE}/functions/go-fn/invoke \
|
||||
-H "X-Test-Sub: ${GO_NS}")
|
||||
STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null)
|
||||
RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null)
|
||||
[ "$STATUS" = "200" ] && break
|
||||
done
|
||||
[ "$STATUS" = "200" ] && pass "Go: invoke → 200" || fail "Go: invoke → got $STATUS (body: $RAW)"
|
||||
echo "$RAW" | grep -q "go-ok" && pass "Go: тело содержит go-ok" || fail "Go: тело не содержит go-ok (got: $RAW)"
|
||||
|
||||
# ──────────────────────────────────────────────
|
||||
echo ""
|
||||
echo "========================================"
|
||||
|
||||
Reference in New Issue
Block a user