elemes/proposal.md

7.8 KiB

Elemes LMS: Sisa Pekerjaan (To-Do List)

Berdasarkan log penyelesaian integrasi Velxio dan dokumen sebelumnya, berikut adalah daftar sisa pekerjaan (TODO) proyek. Terakhir diperbarui: 2026-04-10.

Sudah Selesai

  • Verifikasi Penamaan Pin (Pin Naming)

    • Diverifikasi dari velxio/frontend/src/data/examples.ts — konvensi pin sudah benar.
    • Tabel referensi pin terdokumentasi di README.md (Arduino Uno, LED, Button, Resistor, RGB LED).
    • componentId Arduino Uno = arduino-uno, pin GND dinormalisasi oleh matchWiring().
  • Pembuatan Konten Tambahan — 3 lesson Arduino baru:

    • hello_serial_arduino.md — Serial Monitor (tanpa wiring, kode saja)
    • button_input_arduino.md — Button + LED (INPUT_PULLUP, 4 expected wiring)
    • traffic_light_arduino.md — Lampu Lalu Lintas 3 LED (6 expected wiring)
  • Update Contoh Materi & Dokumentasi Guru

    • examples/content/ disinkronkan (8 file, byte-identical dengan content/)
    • README.md ditambahkan: blok Arduino/Velxio, referensi pin, evaluasi, 3 FAQ baru, tabel jenis materi
    • home.md sekarang mendaftarkan 7 lesson
  • Network Config di Docker/Podman

    • Typo drive: bridgedriver: bridge di podman-compose.yml
    • network_mode: service:elemes-ts dihapus karena tidak kompatibel dengan networks block
  • Commit semua perubahan

    • Elemes: 2 commit ahead of origin
    • Velxio: 2 commit ahead of origin
  • Locust E2E Test Suiteload-test/ folder:

    • content_parser.py — scan content/*.md, deteksi tipe, ekstrak test data → test_data.json
    • locustfile.py — 7 weighted tasks (browse, view detail, compile C, compile Python, verify Arduino, complete flow, progress report)
    • Auto-inject token test (LOCUST_TEST_*) ke tokens_siswa.csv
    • URL backend dikonfigurasi user melalui Locust web UI

🔴 Prioritas Tinggi

  • Testing End-to-End (E2E)
    • Script Locust sudah disiapkan (di dalam load-test/).
    • Bug pada proxy JSON parsing dari frontend ke backend sudah diperbaiki dengan force=True dan silent=True di auth.py, sehingga Login via test suite berhasil.
  • Push ke Remote
    • git push untuk repo elemes dan velxio (keduanya ahead of origin).
  • Hapus file test lama di root elemes/:
    • rm elemes/content_parser.py elemes/locustfile.py elemes/requirements-test.txt (sudah dibersihkan sebelumnya, sekarang rapi di load-test).

🟡 Prioritas Sedang

  • Tuning Crosshair/UX Mobile
    • Melakukan fine-tuning pada opacity warna dan pola garis dashed pada crosshair UI di Velxio agar lebih responsif terhadap device layar sentuh saat dipakai live.

🟢 Prioritas Rendah (Enhancement Simulator Velxio)

  • Mengunci Tata Letak (Component Locking)
    • Menonaktifkan fitur drag atau delete komponen pada tampilan embed, sehingga siswa hanya difokuskan pada kegiatan menarik (wiring) kabel saja tanpa mengganggu tatanan dasar board.
  • Solution Overlay
    • Mengembangkan tampilan overlay solusi/jawaban wiring untuk review mode, agar siswa melihat panduan visual kabel mana yang kurang pas.
  • Perintah elemes:compile_and_run API Bridge
    • Mengkoneksikan trigger kompilasi sehingga UI utama Elemes juga bisa mem-bypass eksekusi ke dalam iFrame (saat ini placeholder compile_and_run bridge belum sepenuhnya utuh ter-wire dengan UI submit).

Opsional

  • Locust Load Testing Plan → Sudah diimplementasi di load-test/
  • Locust Hasil Analisis — Evaluasi skenario 50 user (5 worker) selesai. Finding: Rata-rata respons LMS stabil di 200ms (50th percentile). Namun, kompilasi Arduino (/velxio/api/compile/) terdeteksi sebagai CPU bottleneck yang menyebabkan waktu tunggu mencapai 30 detik (95th percentile) di bawah tekanan serbuan request berskala ekstrem. Server/LMS dinilai layak dan responsif secara keseluruhan.

🚨 Security Review & Vulnerability Fixes (Prioritas Kritis)

Berdasarkan hasil code review terbaru yang difokuskan pada keamanan sistem dan exposed routes API, ditemukan beberapa celah kerentanan kritis yang perlu segera diperbaiki. Berikut adalah detail temuan dan task perbaikannya:

1. Remote Code Execution (RCE) via Endpoint /compile

  • Penjelasan: Endpoint /compile di elemes/routes/compile.py menerima dan mengeksekusi kode C dan Python yang di-submit oleh pengguna secara langsung (via subprocess.run). Eksekusi ini berjalan di dalam kontainer elemes tanpa adanya batasan hak akses atau sandbox tambahan. Pengguna anonim/jahat dapat mengeksekusi shell script atau perintah OS (seperti os.system("rm -rf /")) untuk menghapus, memodifikasi, atau membaca file sensitif. Terlebih lagi, volume content, tokens_siswa.csv, dan assets di-mount dengan akses read-write pada konfigurasi podman/docker, sehingga token akses seluruh siswa rentan diretas atau data materi bisa terhapus.
  • Task Perbaikan:
    • Gunakan Sandbox gVisor (Compiler Worker): Pisahkan fungsi kompilasi ke dalam kontainer terpisah (compiler-worker) yang dijalankan menggunakan runtime runsc (gVisor). Backend utama akan mengirimkan kode via HTTP internal.
    • Read-Only Mounts: Ubah konfigurasi bind mount di podman-compose.yml pada direktori sensitif (tokens_siswa.csv, content, assets) menjadi read-only dengan menambahkan parameter :ro pada kontainer backend utama.
    • Otentikasi / Wajib Login: Lindungi route /compile dengan menambahkan pengecekan token mahasiswa agar tidak bisa diakses oleh user anonim di luar sistem.
    • Resource Limiting: Terapkan limit komputasi RAM dan CPU pada kontainer worker guna menghindari celah Denial of Service (DoS).

2. Information Disclosure via Endpoint /progress-report.json

  • Penjelasan: Rute /progress-report.json dan /progress-report/export-csv di elemes/routes/progress.py dapat diakses oleh siapa saja karena tidak menerapkan validasi token atau role checks. Data kemajuan belajar dan nama semua siswa di dalam file CSV akan terekspos tanpa otentikasi.
  • Task Perbaikan:
    • Otentikasi Token: Tambahkan validasi token (via validate_token) sebelum memberikan response dari kedua route tersebut.

3. Miskonfigurasi CORS Longgar (Overly Permissive)

  • Penjelasan: Deklarasi CORS(app) di elemes/app.py mengizinkan seluruh asal domain (all origins) secara default (*). Mengingat sistem sudah menggunakan sesi berbasis Cookie (samesite='Lax'), ada potensi ancaman pengiriman requests lintas website dari penyerang.
  • Task Perbaikan:
    • Batasi Konfigurasi CORS: Gunakan environment variable ORIGIN untuk menentukan domain eksplisit yang diizinkan (misal: http://localhost:3000).

4. Penyimpanan Token Teks Terbuka (Plaintext Credentials)

  • Penjelasan: Data di tokens_siswa.csv menyimpan token dalam format plaintext. Meskipun hanya file CSV lokal, bocornya satu file tersebut akan mengkompromikan semua token akses dalam sistem (terutama karena kerentanan RCE di poin 1).
  • Task Perbaikan:
    • Proteksi Token CSV: Prioritas utama adalah menambal vulnerability utama (RCE via gVisor & Read-Only Mounts) agar peretas tidak bisa mengekstrak isinya.
    • (Opsional) Hashed Tokens: Gunakan fungsi hashing saat membaca/memverifikasi token.

5. Tidak Ada Sanitasi Input pada Parameter Path (Defense in Depth)

  • Penjelasan: Fungsi route /lesson/<filename>.json di elemes/routes/lessons.py mengandalkan <filename> yang langsung disambungkan via os.path.join(). Meskipun Flask memblokir ../ (Directory Traversal konvensional), tetap berisiko jika pengguna memanipulasi request API secara lebih advanced.
  • Task Perbaikan:
    • Terapkan secure_filename: Gunakan werkzeug.utils.secure_filename(filename) sebelum argumen <filename> disambung ke direktori content.