1 poin oleh GN⁺ 2024-01-14 | 1 komentar | Bagikan ke WhatsApp
  • Gangguan lama No user logon di Counter-Strike juga dapat direproduksi di CS2; jika terhubung ke server terlalu cepat segera setelah game dimulai, verifikasi Steam ID bisa saja tidak dimulai
  • Intinya, saat CS2.exe sedang berjalan, loop levelload berakhir terlalu dini sebelum verifikasi Steam3 selesai, lalu server memproses koneksi dengan Steam ID yang belum diverifikasi
  • Dalam log Esportal, pengguna normal pun mencatat STEAM USERID validated sekitar 1 menit 20 detik setelah koneksi, sementara pengguna yang gagal terputus 2–3 menit kemudian dengan STEAMAUTH failure code 8 dan NETWORK_DISCONNECT_STEAM_LOGON
  • Instal ulang game, verifikasi file, restart Steam, reboot PC, dan menonaktifkan WiFi tidak memperbaiki akar masalah; CS2 harus dijalankan lebih dulu, lalu tunggu 5–10 detik di menu utama
  • Pada 10 Januari 2024, Esportal memperbaiki perilaku yang menjalankan steam://connect/<IP>:<Port> sebelum CS2.exe sepenuhnya terinisialisasi, dan setelah itu porsi tiket terkait turun menjadi 0%

Fenomena No user logon yang Terus Berulang sejak Lama

  • Gangguan No user logon di Counter-Strike dikenal sebagai masalah yang terjadi secara acak saat bermain, dan dilaporkan berulang kali di berbagai forum serta forum dukungan resmi Valve dari 2008 hingga 2023
  • No user logon dan No steam logon yang terlihat di beberapa tulisan kemungkinan secara teknis adalah nama berbeda untuk akar masalah yang sama
  • Solusi yang tersebar luas di internet tidak memperbaiki akar masalahnya
    • Instal ulang game
    • Verifikasi file game
    • Restart Steam
    • Reboot komputer
    • Nonaktifkan WiFi
  • CS2 menggantikan CS:GO pada 27 September 2023, dan pengguna umum tidak lagi dapat memainkan CS:GO
  • Cakupan bug bounty HackerOne milik Valve tidak mencakup cs2.exe, dan laporan CS2 Limited Test juga ditandai berada di luar cakupan

Laporan yang Mendadak Meningkat di Esportal

  • Esportal juga pernah mengalami masalah ini di CS:GO sebelumnya; kejadian pertama yang tercatat adalah 2019-11-15 19:15:32 CET, dan kejadian CS:GO terakhir adalah 2023-09-26 21:38:01 CET, sehari sebelum digantikan oleh CS2
  • Pada awal CS2, masalah ini tampak menghilang, tetapi laporan pengguna meningkat pada minggu pertama Januari 2024
    • 2024-01-03: 6% dari tiket harian
    • 2024-01-05~06: 18%
    • 2024-01-07: 23%
    • 2024-01-08: 10%
    • 2024-01-09: 9%
  • Waktu laporan terutama terkonsentrasi pada 13–17 CET, yang setara dengan 04–08 waktu Washington, lokasi Valve
  • Sebelumnya, laporan tersebar merata sepanjang hari, tetapi masalah yang baru diamati ini terkonsentrasi pada rentang waktu tertentu
  • Pemain di luar Esportal juga mengalami masalah yang sama, jadi ini bukan masalah yang hanya terjadi pada platform tertentu

Gejala: Verifikasi Steam yang Terlambat dan Skin yang Hilang

  • Error No user logon yang diamati terjadi 2–3 menit setelah pemain terhubung ke server game, dan interval waktu ini cukup konsisten
  • Seorang rekan mengatakan, “selama beberapa menit setelah masuk ke game, skin tidak terlihat di CS2,” dan pemain di luar Esportal juga melaporkan skin yang tidak muncul
  • Karena skin terhubung dengan kepemilikan Steam ID, sampai skin pribadi muncul, ada kemungkinan pemain belum diautentikasi dengan benar melalui Steam
  • Dalam log pengguna normal, STEAM USERID validated tercatat sekitar 1 menit 20 detik setelah koneksi
16:39:55: "Alice<1><>" connected
16:41:14: "Alice<1><>" STEAM USERID validated
17:17:32: "Alice<1><CT>" disconnected (reason "NETWORK_DISCONNECT_DISCONNECT_BY_USER")
  • Pada log lama sebelum 3 Januari 2024, verifikasi Steam selesai dalam 2–3 detik setelah koneksi
  • Pada jam malam di Washington, masalah dapat direproduksi langsung; pada jam siang di Washington, tidak dapat direproduksi

NETWORK_DISCONNECT_STEAM_LOGON dan failure code 8

  • Dalam log pengguna yang gagal, koneksi terputus dengan NETWORK_DISCONNECT_STEAM_LOGON tepat setelah STEAMAUTH: Client Bob received failure code 8
16:40:13: "Bob<6><>" connected
16:43:02: STEAMAUTH: Client Bob received failure code 8
16:43:02: "Bob<6><TERRORIST>" disconnected (reason "NETWORK_DISCONNECT_STEAM_LOGON")
  • NETWORK_DISCONNECT_STEAM_LOGON diduga merupakan pengenal internal untuk pesan No user logon yang dilihat pengguna
  • String STEAMAUTH: Client %s received failure code %d ditemukan di libengine2.so, lalu dibandingkan bersama sv_steamauth.cpp dari source CS:GO yang bocor dan hasil reverse engineering
  • Fungsi terkait di CS2 memutus klien berdasarkan nilai eAuthSessionResponse
    • 1: k_EAuthSessionResponseUserNotConnectedToSteam
    • 7: k_EAuthSessionResponseAuthTicketInvalidAlreadyUsed
    • 8: k_EAuthSessionResponseAuthTicketInvalid
  • failure code 8 tampaknya sesuai dengan k_EAuthSessionResponseAuthTicketInvalid, yang muncul saat verifikasi Steam3 gagal

Alur Verifikasi Steam3

  • Klien game CS2.exe mengirimkan Steam ID miliknya saat terhubung ke server game
  • Server game memiliki struktur yang menanyakan ke server Steam3 apakah Steam ID tersebut valid dan apakah pengguna memiliki gamenya
  • Sambil menunggu respons verifikasi, pemain tetap dapat bermain di server, tetapi skin pribadi mungkin tidak terlihat
  • Jika server Steam3 mengembalikan “yes”, server game mempercayai informasi tersebut dan dapat menerapkan informasi pribadi seperti skin
  • Jika server Steam3 mengembalikan “no”, server game memutus klien dengan NETWORK_DISCONNECT_STEAM_LOGON
  • Dalam situasi respons Steam3 melambat pada jam malam di Washington, butuh sekitar 1 menit 20 detik sampai verifikasi selesai

Verifikasi Kepercayaan CS2.exe dan Klien Steam

  • Steam ID yang valid saja tidak membuktikan bahwa instance CS2.exe tersebut adalah game milik akun Steam yang sedang login di mesin yang sama
  • CS2.exe harus terhubung dengan Steam.exe di mesin yang sama untuk memastikan bahwa Steam ID yang dikirimnya cocok dengan akun Steam yang sedang login
  • Jika Steam.exe mengonfirmasi kecocokan tersebut, ia menyimpan sementara informasi di server Steam3 bahwa Steam ID tersebut valid untuk CS2
  • Dari beberapa kandidat penyebab Steam3 dapat mengembalikan “no”, dua yang paling dekat dengan masalah sebenarnya dipersempit menjadi berikut
    • Instance CS2.exe tidak dipercaya
    • Server Steam3 belum mengetahui informasi Steam ID untuk instance CS2.exe tersebut

Petunjuk di Sisi Klien: NETWORK_DISCONNECT_LOOPSHUTDOWN

  • Dalam log kegagalan, NETWORK_DISCONNECT_LOOPSHUTDOWN muncul lebih dulu sebelum NETWORK_DISCONNECT_STEAM_LOGON
16:40:03: "Bob<6><>" connected
16:40:08: "Bob<6><Unassigned>" disconnected (reason "NETWORK_DISCONNECT_LOOPSHUTDOWN")
16:40:13: "Bob<6><>" connected
16:43:02: STEAMAUTH: Client Bob received failure code 8
16:43:02: "Bob<6><TERRORIST>" disconnected (reason "NETWORK_DISCONNECT_STEAM_LOGON")
  • Setelah NETWORK_DISCONNECT_LOOPSHUTDOWN, game otomatis mencoba terhubung kembali 5 detik kemudian
  • Pemutusan pertama ini dimulai bukan oleh server game, melainkan oleh CS2.exe itu sendiri
  • Karena itu, akar masalahnya ada di sisi klien game, bukan di server game

Loop levelload Source 2 dan Urutan Inisialisasi

  • Engine Source 2 menjalankan satu loop aktif dalam satu waktu, dan loop mengulang pemrosesan tugas latar belakang serta input pengguna sampai target tertentu selesai
  • Loop yang pada akhirnya berjalan setelah CS2.exe dimulai adalah loop game, yang menangani interaksi menu dan gameplay sebenarnya
  • Dalam output konsol, tepat sebelum beralih ke loop game, status autentikasi Steam ditampilkan sebagai OK
[SteamNetSockets] AuthStatus (steamid:<redacted>):  OK  (OK)
[Client] CL:  CLoopModeLevelLoad::MaybeSwitchToGameLoop switching to "game" loopmode with addons ()
[EngineServiceManager] SwitchToLoop game requested:  id [1] addons []
  • levelload adalah loop inisialisasi yang berjalan saat CS2 dimulai, dan tampaknya memuat layar awal seperti video intro dan menu utama meski bukan map sebenarnya
  • Salah satu tugas terakhir levelload adalah memulai verifikasi Steam3 dari CS2.exe melalui Steam.exe

Penyebab Langsung Bug

  • CS2 baru dapat dianggap sepenuhnya terinisialisasi setelah loop levelload selesai dengan sukses
  • Jika berhenti terlalu dini sebelum inisialisasi levelload selesai, verifikasi Steam3 tidak dimulai
  • Instance CS2.exe dalam kondisi ini menjadi rusak, dan tidak akan pulih sampai CS2 direstart begitu saja
  • Alur bugnya sebagai berikut
    • CS2.exe dimulai
    • Loop levelload dimulai
    • levelload berakhir terlalu dini sebelum memulai verifikasi Steam3
    • Loop game terhubung ke server game dengan Steam ID yang belum diverifikasi
    • Server game memeriksa ke Steam3
    • Setelah maksimal sekitar 2 menit 50 detik, menerima respons gagal dan terputus dengan No user logon
  • Masalah ini dibahas berdasarkan contoh dan nama CS2, tetapi bug yang setara juga ada di CS:GO dan Counter-Strike: Source; hanya nama teknis dan caranya yang berbeda

Cara Koneksi yang Memicu Bug

  • Masalah ini adalah race condition berdasarkan cara CS2 dimulai
  • Cara yang hampir pasti memicu bug adalah langsung terhubung ke server game saat CS2 belum terbuka
  • Cara koneksi yang berisiko adalah sebagai berikut
    • Menghubungkan ke server dari browser server di luar game saat CS2 belum berjalan atau baru saja mulai berjalan
    • Menghubungkan ke teman dari daftar teman Steam saat CS2 belum berjalan atau baru saja mulai berjalan
    • Menghubungkan langsung dari luar melalui protokol browser Steam seperti steam://connect/127.0.0.1:27015
  • Jika tindakan di atas dilakukan sebelum CS2 sepenuhnya terinisialisasi setelah dimulai, kemungkinan terjadinya lebih tinggi
  • Proporsi penyebabnya dirangkum dengan perumpamaan: “cara memulai Counter-Strike 90%, kecepatan komputer 3%, kecepatan pengguna 3%, kondisi bulan 3%, masalah konfigurasi pengguna yang sebenarnya 1%”

Solusi Nyata

  • Tindakan yang tidak perlu dilakukan
    • Instal ulang game
    • Verifikasi file game
    • Restart Steam
    • Reboot komputer
    • Nonaktifkan WiFi
    • Menghubungkan ke server game dari luar sebelum CS2 dimulai
  • Sebagai gantinya, jalankan CS2 lebih dulu dan tunggu cukup lama sebelum terhubung ke server game
  • Patokannya adalah menunggu sampai konsol game terlihat, atau menunggu 5–10 detik setelah video intro terlihat
  • Untuk memastikan, setelah menjalankan CS2, masukkan status di konsol game dan periksa baris berikut
[EngineServiceManager] @ Current  :  game

Hasil Perbaikan Esportal

  • Alasan pengguna yang gagal, Bob, berhasil diverifikasi 9 menit setelah percobaan pertama adalah karena ia memulai ulang CS2, dan saat itu kebetulan bug tidak terjadi
  • Setelah Steam ID diverifikasi sekali, pada instance game yang sama kegagalan tidak akan terjadi lagi nanti selama klien Steam tidak ditutup
  • Hingga 10 Januari 2024, segera setelah proses CS2.exe dibuat, Esportal menghubungkan pemain ke server matchmaking melalui steam://connect/<IP>:<Port> bahkan sebelum inisialisasi penuh selesai
  • Setelah perilaku tersebut diperbaiki dan dirilis ke semua pemain Esportal, tiket pengguna terkait berhenti
  • Porsi No user logon dalam tiket harian sempat naik hingga 23% pada 2024-01-07, tetapi turun menjadi 0% dari 2024-01-10 hingga 2024-01-12

1 komentar

 
GN⁺ 2024-01-14
Opini Hacker News
  • Alur pada diagram lebih dekat dengan mekanisme yang disebut Steam sebagai Session Tickets, dan kenyataannya sedikit lebih bernuansa
    Klien game meminta tiket sesi ke server Steam, lalu mengirimkan tiket itu ke server game untuk membuktikan bahwa dirinya adalah Steam ID tertentu
    Setelah itu server game harus memeriksanya secara online ke Web API Steam untuk memastikan tiket tersebut tidak dipakai berkali-kali atau dimodifikasi
    Kedengarannya klien CS2 tidak menangani respons yang terlambat dengan benar dalam proses memperoleh tiket sesi
    Alurnya dijelaskan secara rinci di sini: https://partner.steamgames.com/doc/features/auth#3
    Jika cara kerjanya seperti diagram di tulisan itu, ini cukup mengkhawatirkan karena penyerang bisa berlomba masuk ke server dengan Steam ID korban

    • Benar, kemungkinan besar memang tiket sesi, dan sepertinya bagian itu tidak dijelaskan dengan jelas di tulisan
      Masalahnya tampak terjadi ketika game terhenti sebelum benar-benar membuat tiket sesi, atau saat menunggu respons server Steam yang lambat, lalu mencoba terhubung ke server game tanpa tiket
    • Benar, secara teknis alur ini tepat, dan saya menganggapnya tidak terlalu penting untuk penjelasan masalah, tetapi seharusnya disebutkan dengan lebih jelas
  • Tulisannya bagus, tetapi proses pelacakan dan kesimpulannya tidak sepenuhnya nyambung
    Mengatakan “cara Counter-Strike dimulai: porsi tanggung jawab 90%”, sementara juga menyatakan bahwa pemain di seluruh dunia mengalami masalah yang sama di luar Esportal dan itu dikonfirmasi karena pemeliharaan tengah malam di Washington, sulit untuk sama-sama benar
    Jika 90% tanggung jawabnya ada pada cara eksekusi, masalahnya tidak akan terdistribusi di jam pemeliharaan
    Intinya tampaknya ada pada bagian “verifikasi Steam ID dimulai tepat sebelum game loop dimulai” dan “jika inisialisasi levelload belum selesai, verifikasi Steam3 adalah tahap terakhir sehingga tidak dimulai”
    Jadi jika server steam3 menjadi sangat lambat pada jam pemeliharaan, proses ini memanjang, dan peluang untuk memulai game lalu memutus loop di sela-sela itu meningkat
    Karena itu “cara Counter-Strike dimulai” memang benar, tetapi ungkapan seperti “keadaan bulan: porsi tanggung jawab 3%” pada dasarnya menunjuk ke jam pemeliharaan, jadi terasa agak meleset
    Sarannya juga akan lebih baik jika mencakup “pada pukul 13–17 CET itu jam pemeliharaan Valve, jadi tunggulah beberapa menit lagi”
    Bagaimanapun, saya pernah mengalami masalah ini, dan solusi “tunggu sebentar sampai loading selesai” adalah yang paling praktis dan masuk akal yang pernah saya dengar sejauh ini

    • Ada celah dalam detail penjelasan atau kesimpulannya, tetapi saya juga tidak yakin tafsir ini sepenuhnya benar
      Di CS:GO, masalah yang sama juga ada terlepas dari jam pemeliharaan, sedangkan di CS2 hanya teramati pada jam pemeliharaan
      Pada akhirnya sifat bug di CS:GO dan CS2 mungkin memang berbeda, tetapi karena CS:GO sudah digantikan CS2, tidak ada lagi cara untuk membuktikannya
  • Dulu, sebelum ada Steam, saya pernah membuat alat yang menampilkan daftar pemain aktif dan skor supaya bisa melihat server yang dimasuki teman lalu langsung ikut masuk
    Saat membuat alat itu, saya mengirim paket yang salah ke server yang sedang diuji, dan servernya mati
    Saya masih punya source code yang ditulis dengan Delphi, dan kalau bug-bug berumur 10 tahun masih tersisa, saya penasaran apakah ini masih bisa mematikan server

    • Bisa dicoba? :D
  • Bug yang sebenarnya adalah autentikasi yang selesai bukan merupakan syarat wajib untuk memulai multiplayer non-LAN

    • Atau masalahnya juga alur verifikasi tiket sesi bergantung pada koneksi antara server game dan server autentikasi Valve. Server autentikasi itu sepertinya kadang sangat lambat
      Cara yang lebih cepat dan tangguh mungkin adalah klien Steam menerima dan menyimpan token bertanda tangan berdurasi beberapa jam dari Valve, lalu mengirim token itu setiap kali terhubung ke server game
      Server game tinggal memverifikasinya secara lokal dengan sertifikat publik yang diterbitkan Valve dan didistribusikan bersama konten server
  • Beberapa paragraf terasa seperti “menaruh topi di atas topi”
    Di atas paragraf yang sudah terasa seperti meme, ditumpuk lagi sarkasme, sehingga unsur yang lebih efektif saat tersirat terasa berlebihan
    Seperti yang dikatakan orang lain, lebih baik masuk ke inti lebih cepat

  • Sangat menyenangkan dibaca. Saya penasaran apakah alasan klien game tiba-tiba crash juga bisa diselidiki dengan cara yang sama
    Saya juga penasaran apakah pemeriksaan integritas executable berjalan saat game sedang berjalan, dan apakah jika salah satunya gagal saat berjalan akan muncul pesan pemutusan koneksi yang berbeda
    Rasanya layak mendapat imbalan seperti tulisan yang menganalisis masalah waktu loading GTA V yang terlalu lama: https://nee.lv/2021/02/28/How-I-cut-GTA-Online-loading-times...

    • Saya penasaran crash tiba-tiba yang mana yang dimaksud
      Crash secara teori bisa diselidiki, tetapi Valve tidak menyimpan laporan crash ke disk, melainkan mengirimkannya ke server
      Kalau tidak tertangkap secara real-time dengan debugger terpasang, analisis jadi lebih sulit, dan karena VAC ini merepotkan, meski bukan mustahil. Matikan saja VAC
  • Menaruh ringkasan di awal tulisan untuk orang yang datang dari pencarian solusi terlihat penuh perhatian
    Namun setelah itu langsung mengatakan “hal yang tidak boleh dilakukan”, sementara tindakan yang benar-benar bisa dilakukan justru disembunyikan dalam satu kalimat di tengah tulisan sepanjang kilometer
    Sebaiknya workaround dimasukkan ke ringkasan

    • Hampir seperti lelucon kejam. Ringkasan: jangan lakukan ini, sebagai gantinya baca seluruh tulisan!
    • “Tulisan sepanjang kilometer” dalam satuan hitung kira-kira 25 kali Page Down, dalam satuan bebas kira-kira CTRL+F
    • Benar, jadi sudah saya ubah menjadi ringkasan yang lebih baik
  • Saya mengatakan ini karena selera menulis ala Strunk and White sudah tertanam di kepala, jadi silakan abaikan kalau mau
    Kalau menginginkan masukan, saya sarankan penyuntingan besar-besaran agar tulisannya jauh lebih langsung dan ringkas
    Menulis panjang boleh saja, tetapi setelah beberapa menit, penjelasan tambahan dan anekdot menumpuk sampai saya cukup cepat kehilangan alur utama
    Ditambah lagi ada gambar referensi Inception, sehingga rasanya makin seperti kumpulan hal yang tidak saling terkait daripada tulisan penyampai informasi
    Pikirkan apa yang ingin dikatakan, katakan itu, lalu kembali dan pastikan benar-benar hanya itu yang dikatakan
    Sisanya lebih mirip latihan mengetik daripada menulis. Kalau yang ingin dikatakan ada 3–4 hal, katakan saja hal-hal itu

  • Tulisannya bagus, tetapi masih menyisakan beberapa pertanyaan
    Apakah levelloadloop hanya dijalankan saat game diluncurkan, dan tidak saat masuk server serta loading map?
    Jika masalahnya adalah loop berakhir sebelum proses autentikasi Steam dimulai, mengapa perlambatan akibat pemeliharaan menjadi penting?

    • Nomor 1 benar, hanya dijalankan saat game diluncurkan
      Nama loop ini tampaknya berkaitan dengan game single-player seperti Portal, dan pada game seperti itu level berganti tanpa jeda, sehingga nama seperti ini jauh lebih alami
      Nomor 2 memang ada celah dalam penjelasannya, dan saya tidak tahu jawabannya
      Namun metode ini jelas memperbaiki masalahnya. Detail kesimpulannya sangat mungkin tidak lengkap, tetapi saat ini saya tidak merasa perlu menggali lebih dalam
  • Teks program bounty Valve menyebutkan bahwa cakupannya mencakup “platform Steam dan game saat ini yang dikembangkan serta diterbitkan oleh Valve”
    Juga disebutkan bahwa mulai 14 Juni 2023 pukul 10 pagi PDT, laporan baru untuk CS:GO berada di luar cakupan, dan laporan CS2 Limited Test juga saat ini berada di luar cakupan
    Memang benar Valve lemah soal keamanan, tetapi jika membaca seluruh deskripsi HackerOne secara luas, secara pribadi saya akan menganggap ini dalam cakupan
    Maksudnya, mereka belum memperbarui tab “Scope” untuk mengecualikan csgo.exe, jadi tab itu saja sulit dipercaya
    Meski begitu, Valve benar-benar harus memperbarui bagian tersebut

    • Karena Valve bahkan tidak menjawab permintaan sederhana untuk menanyakan apakah ini masuk cakupan, kita tidak bisa tahu
      Namun saya setuju dengan kesimpulannya, dan itu masuk akal