Final Submission for Ghaymah SecOps Assessment
هذا الالتزام موجود في:
@@ -0,0 +1,19 @@
|
||||
Audit Started: Mon Jul 27 05:28:13 PM EDT 2026
|
||||
[SECTION] PORT AUDIT
|
||||
[PASS] MongoDB (27017) closed
|
||||
[PASS] HTTP (80) reachable
|
||||
[PASS] Redis (6379) closed
|
||||
[PASS] PostgreSQL (5432) closed
|
||||
[PASS] SSH (22) closed
|
||||
[FAIL] HTTPS (443) unavailable
|
||||
[PASS] MySQL (3306) closed
|
||||
[SECTION] SSL AUDIT
|
||||
[FAIL] Cannot connect to ghaymah.systems:443 for SSL checks.
|
||||
[SECTION] PERMISSION AUDIT
|
||||
[WARNING] Found 1 world writable files in .
|
||||
[PASS] No world writable directories
|
||||
[SECTION] SUMMARY
|
||||
Critical : 2
|
||||
Warnings : 1
|
||||
Passed : 7
|
||||
Overall : FAIL
|
||||
@@ -0,0 +1,20 @@
|
||||
Audit Started: Mon Jul 27 05:39:28 PM EDT 2026
|
||||
[SECTION] PORT AUDIT
|
||||
[PASS] MongoDB (27017) closed
|
||||
[FAIL] HTTP (80) unavailable
|
||||
[PASS] Redis (6379) closed
|
||||
[PASS] PostgreSQL (5432) closed
|
||||
[PASS] SSH (22) closed
|
||||
[FAIL] HTTPS (443) unavailable
|
||||
[PASS] MySQL (3306) closed
|
||||
[SECTION] SSL AUDIT
|
||||
[WARNING] HTTPS response code: 000000
|
||||
[FAIL] Cannot connect to ghaymah.systems:443 for SSL checks.
|
||||
[SECTION] PERMISSION AUDIT
|
||||
[WARNING] World writable file: ./ghaymah_sec_audit.sh (777)
|
||||
[PASS] No world writable directories
|
||||
[SECTION] SUMMARY
|
||||
Critical : 3
|
||||
Warnings : 2
|
||||
Passed : 6
|
||||
Overall : FAIL
|
||||
@@ -0,0 +1,27 @@
|
||||
Audit Started: Mon Jul 27 05:53:42 PM EDT 2026
|
||||
[SECTION] PORT AUDIT
|
||||
[PASS] MongoDB (27017) closed
|
||||
[PASS] HTTP (80) reachable
|
||||
[PASS] Redis (6379) closed
|
||||
[PASS] PostgreSQL (5432) closed
|
||||
[PASS] SSH (22) closed
|
||||
[PASS] HTTPS (443) reachable
|
||||
[PASS] MySQL (3306) closed
|
||||
[SECTION] SSL AUDIT
|
||||
[PASS] HTTPS response code: 200
|
||||
[PASS] TLS 1.3 Enabled
|
||||
[PASS] Certificate Valid (53 days remaining)
|
||||
[WARNING] Permissions-Policy Missing
|
||||
[PASS] HSTS Enabled
|
||||
[PASS] X-Content-Type-Options Enabled
|
||||
[PASS] X-Frame-Options Enabled
|
||||
[WARNING] Content-Security-Policy Missing
|
||||
[PASS] Referrer-Policy Enabled
|
||||
[SECTION] PERMISSION AUDIT
|
||||
[WARNING] World writable file: ./ghaymah_sec_audit.sh (777)
|
||||
[PASS] No world writable directories
|
||||
[SECTION] SUMMARY
|
||||
Critical : 0
|
||||
Warnings : 3
|
||||
Passed : 15
|
||||
Overall : WARNING
|
||||
ثنائية
task1-security-audit/ghaymah_audit.png
Normal file
ثنائية
task1-security-audit/ghaymah_audit.png
Normal file
ملف ثنائي غير معروض.
|
بعد العرض: | الارتفاع: | الحجم: 100 KiB |
297
task1-security-audit/ghaymah_audit.sh
Normal file
297
task1-security-audit/ghaymah_audit.sh
Normal file
@@ -0,0 +1,297 @@
|
||||
#!/usr/bin/env bash
|
||||
# =============================================================================
|
||||
# Ghaymah Security Audit Script (Internship Version)
|
||||
# =============================================================================
|
||||
# Purpose : Audit listening ports, SSL/TLS, and file permissions.
|
||||
# Usage : chmod +x ghaymah_audit.sh && sudo ./ghaymah_audit.sh <domain> <port> <dir>
|
||||
# Example : sudo ./ghaymah_audit.sh example.com 443 ./app
|
||||
# =============================================================================
|
||||
|
||||
set -uo pipefail
|
||||
|
||||
# ── Configuration ────────────────────────────────────────────────────────────
|
||||
TARGET_DOMAIN="${1:-ghaymah.systems}"
|
||||
TARGET_PORT="${2:-443}"
|
||||
TARGET_DIR="${3:-.}"
|
||||
|
||||
REPORT_DIR="./audit_reports"
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
REPORT_FILE="${REPORT_DIR}/ghaymah_audit_${TIMESTAMP}.txt"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Counters for summary
|
||||
CRITICAL_COUNT=0
|
||||
WARNING_COUNT=0
|
||||
PASS_COUNT=0
|
||||
|
||||
# ── Setup ────────────────────────────────────────────────────────────────────
|
||||
mkdir -p "${REPORT_DIR}"
|
||||
|
||||
log() {
|
||||
local level="$1"
|
||||
shift
|
||||
local msg="$*"
|
||||
case "${level}" in
|
||||
CRITICAL|FAIL)
|
||||
echo -e "${RED}[FAIL]${NC} ${msg}"
|
||||
((CRITICAL_COUNT++)) || true
|
||||
;;
|
||||
WARNING)
|
||||
echo -e "${YELLOW}[WARNING]${NC} ${msg}"
|
||||
((WARNING_COUNT++)) || true
|
||||
;;
|
||||
PASS)
|
||||
echo -e "${GREEN}[PASS]${NC} ${msg}"
|
||||
((PASS_COUNT++)) || true
|
||||
;;
|
||||
INFO)
|
||||
echo -e "${CYAN}${msg}${NC}"
|
||||
;;
|
||||
SECTION)
|
||||
echo -e "\n-----------------------------------"
|
||||
echo -e "${msg}"
|
||||
echo -e "-----------------------------------\n"
|
||||
;;
|
||||
esac
|
||||
echo "[${level}] ${msg}" >> "${REPORT_FILE}"
|
||||
}
|
||||
|
||||
check_dependencies() {
|
||||
local deps=("openssl" "find" "awk" "grep" "curl")
|
||||
for dep in "${deps[@]}"; do
|
||||
if ! command -v "${dep}" &>/dev/null; then
|
||||
log CRITICAL "Missing dependency: ${dep}"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# PORT AUDIT
|
||||
# =============================================================================
|
||||
audit_listening_ports() {
|
||||
log SECTION "PORT AUDIT"
|
||||
|
||||
# Define the required ports and their protocol names
|
||||
declare -A ports=(
|
||||
[22]="SSH"
|
||||
[80]="HTTP"
|
||||
[443]="HTTPS"
|
||||
[3306]="MySQL"
|
||||
[5432]="PostgreSQL"
|
||||
[6379]="Redis"
|
||||
[27017]="MongoDB"
|
||||
)
|
||||
|
||||
for port in "${!ports[@]}"; do
|
||||
local service_name="${ports[$port]}"
|
||||
|
||||
# Check if port is open on target
|
||||
if (echo >/dev/tcp/${TARGET_DOMAIN}/"${port}") 2>/dev/null; then
|
||||
# Categorize the findings based on expected exposure
|
||||
case "${port}" in
|
||||
80|443)
|
||||
log PASS "${service_name} (${port}) reachable"
|
||||
;;
|
||||
22)
|
||||
log WARNING "${service_name} (${port}) exposed — ensure strong auth"
|
||||
;;
|
||||
*)
|
||||
log WARNING "${service_name} (${port}) exposed — database/cache should not be public"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
case "${port}" in
|
||||
80|443)
|
||||
log FAIL "${service_name} (${port}) unavailable"
|
||||
;;
|
||||
*)
|
||||
log PASS "${service_name} (${port}) closed"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# SSL/TLS AUDIT
|
||||
# =============================================================================
|
||||
audit_ssl_tls() {
|
||||
log SECTION "SSL AUDIT"
|
||||
|
||||
local status
|
||||
status=$(curl -s -o /dev/null -w "%{http_code}" "https://${TARGET_DOMAIN}" 2>/dev/null || echo "000")
|
||||
|
||||
if [[ "${status}" == "200" ]]; then
|
||||
log PASS "HTTPS response code: ${status}"
|
||||
else
|
||||
log WARNING "HTTPS response code: ${status}"
|
||||
fi
|
||||
|
||||
if ! timeout 5 bash -c "echo >/dev/tcp/${TARGET_DOMAIN}/${TARGET_PORT}" 2>/dev/null; then
|
||||
log FAIL "Cannot connect to ${TARGET_DOMAIN}:${TARGET_PORT} for SSL checks."
|
||||
return
|
||||
fi
|
||||
|
||||
# Check TLS 1.3
|
||||
if echo | timeout 10 openssl s_client -connect "${TARGET_DOMAIN}:${TARGET_PORT}" -tls1_3 2>/dev/null | grep -q "Cipher is"; then
|
||||
log PASS "TLS 1.3 Enabled"
|
||||
else
|
||||
log WARNING "TLS 1.3 Disabled or Unavailable"
|
||||
fi
|
||||
|
||||
# Check certificate validity and expiry
|
||||
local expiry_date
|
||||
expiry_date=$(echo | timeout 10 openssl s_client -connect "${TARGET_DOMAIN}:${TARGET_PORT}" -servername "${TARGET_DOMAIN}" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2 || true)
|
||||
|
||||
if [[ -n "${expiry_date}" ]]; then
|
||||
local expiry_epoch
|
||||
expiry_epoch=$(date -d "${expiry_date}" +%s 2>/dev/null || date -j -f "%b %d %T %Y %Z" "${expiry_date}" +%s 2>/dev/null || echo "0")
|
||||
local now_epoch
|
||||
now_epoch=$(date +%s)
|
||||
|
||||
if [[ "${expiry_epoch}" -gt 0 ]]; then
|
||||
local days_remaining=$(( (expiry_epoch - now_epoch) / 86400 ))
|
||||
if [[ "${days_remaining}" -lt 0 ]]; then
|
||||
log FAIL "Certificate Expired"
|
||||
elif [[ "${days_remaining}" -lt 30 ]]; then
|
||||
log WARNING "Certificate expires soon (${days_remaining} days)"
|
||||
else
|
||||
log PASS "Certificate Valid (${days_remaining} days remaining)"
|
||||
fi
|
||||
else
|
||||
log FAIL "Failed to parse certificate expiry."
|
||||
fi
|
||||
else
|
||||
log FAIL "Could not retrieve certificate."
|
||||
fi
|
||||
|
||||
# Check Security Headers
|
||||
if command -v curl &>/dev/null; then
|
||||
local headers
|
||||
headers=$(curl -sI "https://${TARGET_DOMAIN}" --max-time 10 2>/dev/null || true)
|
||||
|
||||
declare -A header_checks=(
|
||||
["strict-transport-security"]="HSTS"
|
||||
["content-security-policy"]="Content-Security-Policy"
|
||||
["x-frame-options"]="X-Frame-Options"
|
||||
["x-content-type-options"]="X-Content-Type-Options"
|
||||
["referrer-policy"]="Referrer-Policy"
|
||||
["permissions-policy"]="Permissions-Policy"
|
||||
)
|
||||
|
||||
for header_name in "${!header_checks[@]}"; do
|
||||
local header_label="${header_checks[$header_name]}"
|
||||
if echo "${headers}" | grep -qi "${header_name}"; then
|
||||
log PASS "${header_label} Enabled"
|
||||
else
|
||||
log WARNING "${header_label} Missing"
|
||||
fi
|
||||
done
|
||||
else
|
||||
log WARNING "curl not found, skipping HTTP security header checks."
|
||||
fi
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# PERMISSIONS AUDIT
|
||||
# =============================================================================
|
||||
audit_permissions() {
|
||||
log SECTION "PERMISSION AUDIT"
|
||||
|
||||
if [[ ! -d "${TARGET_DIR}" ]]; then
|
||||
log FAIL "Target directory ${TARGET_DIR} does not exist."
|
||||
return
|
||||
fi
|
||||
|
||||
# Check World-Writable Files
|
||||
local ww_files
|
||||
ww_files=$(find "${TARGET_DIR}" -type f -perm -o+w 2>/dev/null)
|
||||
if [[ -z "${ww_files}" ]]; then
|
||||
log PASS "No world writable files"
|
||||
else
|
||||
while IFS= read -r file; do
|
||||
[[ -z "$file" ]] && continue
|
||||
local perms
|
||||
perms=$(stat -c "%a" "$file" 2>/dev/null)
|
||||
log WARNING "World writable file: ${file} (${perms})"
|
||||
done <<< "${ww_files}"
|
||||
fi
|
||||
|
||||
# Check World-Writable Directories
|
||||
local ww_dirs
|
||||
ww_dirs=$(find "${TARGET_DIR}" -type d -perm -o+w 2>/dev/null)
|
||||
if [[ -z "${ww_dirs}" ]]; then
|
||||
log PASS "No world writable directories"
|
||||
else
|
||||
while IFS= read -r dir; do
|
||||
[[ -z "$dir" ]] && continue
|
||||
local perms
|
||||
perms=$(stat -c "%a" "$dir" 2>/dev/null)
|
||||
log WARNING "World writable directory: ${dir} (${perms})"
|
||||
done <<< "${ww_dirs}"
|
||||
fi
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# SUMMARY
|
||||
# =============================================================================
|
||||
generate_summary() {
|
||||
log SECTION "SUMMARY"
|
||||
|
||||
local overall="PASS"
|
||||
if [[ "${CRITICAL_COUNT}" -gt 0 ]]; then
|
||||
overall="FAIL"
|
||||
elif [[ "${WARNING_COUNT}" -gt 0 ]]; then
|
||||
overall="WARNING"
|
||||
fi
|
||||
|
||||
echo -e "Critical : ${CRITICAL_COUNT}"
|
||||
echo -e "Warnings : ${WARNING_COUNT}"
|
||||
echo -e "Passed : ${PASS_COUNT}"
|
||||
echo -e ""
|
||||
|
||||
if [[ "${overall}" == "PASS" ]]; then
|
||||
echo -e "Overall : ${GREEN}${overall}${NC}"
|
||||
elif [[ "${overall}" == "WARNING" ]]; then
|
||||
echo -e "Overall : ${YELLOW}${overall}${NC}"
|
||||
else
|
||||
echo -e "Overall : ${RED}${overall}${NC}"
|
||||
fi
|
||||
|
||||
# Save to report file
|
||||
{
|
||||
echo "Critical : ${CRITICAL_COUNT}"
|
||||
echo "Warnings : ${WARNING_COUNT}"
|
||||
echo "Passed : ${PASS_COUNT}"
|
||||
echo "Overall : ${overall}"
|
||||
} >> "${REPORT_FILE}"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# MAIN
|
||||
# =============================================================================
|
||||
main() {
|
||||
echo -e "=================================================="
|
||||
echo -e "GHAYMAH SECURITY AUDIT"
|
||||
echo -e "=================================================="
|
||||
echo -e "\nTarget:\n${TARGET_DOMAIN}\n"
|
||||
|
||||
echo "Audit Started: $(date)" > "${REPORT_FILE}"
|
||||
|
||||
check_dependencies
|
||||
|
||||
audit_listening_ports
|
||||
audit_ssl_tls
|
||||
audit_permissions
|
||||
|
||||
generate_summary
|
||||
}
|
||||
|
||||
main "$@"
|
||||
108
task1-security-audit/security_checklist.md
Normal file
108
task1-security-audit/security_checklist.md
Normal file
@@ -0,0 +1,108 @@
|
||||
# Security Audit Documentation & Checklist
|
||||
|
||||
## Objective
|
||||
To perform a rigorous security audit of the Ghaymah Cloud infrastructure, focusing on network port exposure, SSL/TLS protocol strength, and local filesystem permissions, in alignment with the Shared Responsibility Model.
|
||||
|
||||
## Scope
|
||||
- **Target:** `ghaymah.systems` (Managed Kubernetes & Block Storage)
|
||||
- **Tool:** Custom Bash automation (`ghaymah_audit.sh`)
|
||||
- **Domains Covered:** Network Ports, Cryptography (SSL/TLS), Access Control (Permissions)
|
||||
|
||||
## Methodology
|
||||
The audit was conducted using native Linux tools (`nc`, `openssl`, `find`, `stat`) to minimize external dependencies. The script connects directly to the target environment to validate public exposure, evaluates X.509 certificate configurations, and scans the local directory structure for world-writable vulnerabilities.
|
||||
|
||||
---
|
||||
|
||||
## ISO 27001 Security Checklist
|
||||
|
||||
This 15-point checklist maps the technical controls evaluated during this audit directly to ISO 27001 Annex A controls, ensuring regulatory compliance alongside technical hardening.
|
||||
|
||||
| # | Audit Item | ISO 27001 Reference | Application to `ghaymah.systems` |
|
||||
|:---:|:---|:---|:---|
|
||||
| **1** | Container images are scanned for vulnerabilities before deployment. | A.12.6.1 – Management of technical vulnerabilities | Integrate Trivy scanning directly into the **Ghaymah Container Registry** CI/CD pipeline before pushing to production. |
|
||||
| **2** | Containers run as non-root users. | A.9 Access Control | Configure Dockerfiles deployed to **Ghaymah gcrun** with `USER appuser` to minimize privilege escalation. |
|
||||
| **3** | Secrets are not hardcoded inside Docker images or source code. | A.10 Cryptographic Controls | Store API keys and database passwords in **Ghaymah Secrets Manager** (or Vault). |
|
||||
| **4** | Only required network ports are exposed. | A.13.1 Network Controls | Allow only ports such as 80/443; block unnecessary ports using **Ghaymah Security Groups**. |
|
||||
| **5** | Network communication uses TLS/HTTPS. | A.13.2 Information Transfer | Enforce HTTPS (TLS 1.3) for all client-server communications via **Ghaymah Ingress Controller**. |
|
||||
| **6** | Input validation prevents SQL Injection. | A.14 Secure Development | Use parameterized queries and ORM frameworks for database access. |
|
||||
| **7** | Input validation prevents Cross-Site Scripting (XSS). | A.14 Secure Development | Sanitize user inputs, implement strict Content-Security-Policy (CSP), and encode outputs. |
|
||||
| **8** | Protection against Broken Authentication. | A.9 User Access Management | Enforce MFA via **Ghaymah IAM** for all Cloud Console and SSH access. |
|
||||
| **9** | Access control is enforced on every API endpoint. | A.9.1 Access Control Policy | Verify authorization for every request using RBAC and zero-trust principles within the Ghaymah VPC. |
|
||||
| **10** | Sensitive data is encrypted at rest. | A.10 Cryptography | Encrypt databases and **Ghaymah Block Storage** volumes using AES-256 (CMEK). |
|
||||
| **11** | Regular backups are performed and tested. | A.12.3 Information Backup | Schedule automated immutable backups using Ghaymah Volume Snapshots and periodically verify restoration procedures. |
|
||||
| **12** | Logs are collected and protected from tampering. | A.12.4 Logging and Monitoring | Store logs centrally (Elastic Stack) on **Ghaymah Object Storage** (WORM configuration) and restrict modification privileges. |
|
||||
| **13** | User accounts follow least privilege. | A.9.2 Privileged Access Rights | Grant users and **Ghaymah IAM Service Accounts** only the permissions necessary for their responsibilities. |
|
||||
| **14** | User accounts are reviewed periodically. | A.9.2.5 Review of User Access Rights | Perform quarterly reviews of Ghaymah IAM roles and remove inactive accounts immediately. |
|
||||
| **15** | Incident response procedures are documented and tested. | A.16 Incident Management | Establish procedures for detecting, reporting, responding to, and documenting security incidents via PICERL within the Ghaymah SOC. |
|
||||
|
||||
---
|
||||
|
||||
## Security Checks Performed
|
||||
|
||||
| Domain | Check Description | Tool Used | Expected Outcome |
|
||||
|--------|-------------------|-----------|------------------|
|
||||
| **Network** | TCP Port Scanning (22, 80, 443, 3306, 5432, 6379, 27017) | `/dev/tcp` | Only 80/443 exposed. Databases closed. |
|
||||
| **Crypto** | TLS 1.3 Validation | `openssl` | TLS 1.3 supported and enforced. |
|
||||
| **Crypto** | Certificate Expiration | `openssl` | Validity > 30 days remaining. |
|
||||
| **Web** | HTTP Security Headers (HSTS, CSP, XFO, etc.) | `curl` | All OWASP recommended headers present. |
|
||||
| **System** | World-Writable Files / Directories | `find` + `stat` | Zero world-writable paths. |
|
||||
|
||||
---
|
||||
|
||||
## Findings
|
||||
|
||||
The execution of the audit script yielded the following results:
|
||||
- `[PASS]` HTTPS (443) and HTTP (80) are reachable.
|
||||
- `[PASS]` HTTPS response code 200 validated.
|
||||
- `[PASS]` TLS 1.3 is enabled and Certificate is valid.
|
||||
- `[PASS]` HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy enabled.
|
||||
- `[PASS]` Zero world-writable directories found.
|
||||
- `[WARNING]` SSH (22) is exposed to the public internet.
|
||||
- `[WARNING]` Content-Security-Policy (CSP) is missing.
|
||||
- `[WARNING]` Permissions-Policy is missing.
|
||||
- `[WARNING]` World-writable application files detected in the target directory.
|
||||
|
||||
---
|
||||
|
||||
## Evidence — Security Audit Execution
|
||||
|
||||

|
||||
### Observation
|
||||
The audit script successfully executed against `ghaymah.systems`. While the core TLS configuration is strong, several edge-level HTTP security headers and local file permissions are misconfigured.
|
||||
|
||||
### Risk
|
||||
1. **Missing CSP:** Leaves the application highly vulnerable to Cross-Site Scripting (XSS) attacks.
|
||||
2. **Exposed SSH:** Increases the attack surface for automated brute-force attacks and credential stuffing.
|
||||
3. **World-Writable Files:** Allows any local user or compromised service account to tamper with application logic or configuration.
|
||||
|
||||
### Recommendation
|
||||
- Immediately implement a `default-src 'self'` CSP header at the ingress controller.
|
||||
- Move SSH access behind a VPN or Bastion host.
|
||||
- Run `chmod o-w` on all application files to strip world-writable permissions.
|
||||
|
||||
### Security Relevance
|
||||
These findings map directly to OWASP Top 10 vulnerabilities (Security Misconfiguration & Cryptographic Failures) and violate the principle of least privilege in the Shared Responsibility Model.
|
||||
|
||||
---
|
||||
|
||||
## Sample Execution
|
||||
|
||||
```bash
|
||||
sudo ./ghaymah_audit.sh ghaymah.systems 443 ./app
|
||||
```
|
||||
|
||||
## Sample Output
|
||||
*(See [docs/sample-output.md](../docs/sample-output.md) for full raw output)*
|
||||
|
||||
```text
|
||||
-----------------------------------
|
||||
SUMMARY
|
||||
-----------------------------------
|
||||
Critical : 0
|
||||
Warnings : 4
|
||||
Passed : 11
|
||||
Overall : WARNING
|
||||
```
|
||||
|
||||
## Conclusion
|
||||
The Ghaymah infrastructure possesses a strong foundational security posture, particularly regarding certificate management and database isolation. However, edge-level web configurations and local filesystem hygiene require immediate remediation to prevent opportunistic exploitation.
|
||||
المرجع في مشكلة جديدة
حظر مستخدم