Pengalihan terbuka di aplikasi Harvest memungkinkan pencurian token OAuth akun Microsoft
(eval.blog)- Dalam alur koneksi OAuth Outlook Calendar milik Harvest, URL callback diarahkan kembali ke tujuan dari nilai
state, sehingga terjadi pengalihan terbuka, dan jika digabungkan dengan alur pemberian implisit, token dapat terekspos ke URL eksternal - Masalahnya bukan pada Microsoft, melainkan pada sisi integrasi Harvest;
redirect_uriOAuth yang terdaftar menjadi titik transit pengalihan yang mengirim pengguna ke domain yang ditentukan penyerang stateadalah JSON yang dienkode sebagai URI, dan jika domain eksternal dengan garis miring sepertiexample.com/dimasukkan kesubdomain, pengguna akan diarahkan ke bentuk sepertiexample.com/.harvestapp.com/...- PoC menunjukkan alur di mana fragmen
#id_token=...ditambahkan ke target pengalihan, dengan menggunakanclient_id=0dcef4db-36d8-4aed-9cc5-ab43e1814884,response_type=id_token,response_mode=fragment,scope=openidpada URL authorize Microsoft OAuth - Kerentanan ini dilaporkan pada 23 Agustus 2020, patch dikonfirmasi pada 1 Agustus 2023, dan pada 22 Oktober 2023 Harvest meminta maaf dengan menyebut keterlambatan tersebut sebagai human error
Alur kebocoran token dari callback OAuth
- Harvest adalah perangkat lunak pelacakan waktu yang memungkinkan pengguna menghubungkan Outlook Calendar melalui OAuth
- Jika otorisasi berhasil, pengguna diarahkan ke
https://outlook-integration.harvestapp.com/auth/outlook-calendar/… - Callback ini kemudian memindahkan pengguna lagi ke URL yang diberikan di dalam
state, dan dalam proses itu terjadi pengalihan terbuka - Nilai
statepada URL callback yang awalnya dikonfirmasi adalah JSON yang dienkode sebagai URI- Setelah didekode, bentuknya adalah
{"return_to":"/","subdomain":"hackerone295"} - Nilai
subdomaindigunakan untuk memperkirakan ruang aplikasi Harvest sepertihackerone295.harvestapp.com
- Setelah didekode, bentuknya adalah
- Jika
subdomaindiberi garis miring sepertiexample.com/, URL callback akan menjadi bentuk yang berpindah ke domain eksternal - Karena URL callback ini adalah redirect_uri yang terdaftar pada aplikasi OAuth, jika pengalihan terbuka digabungkan dengan alur pemberian implisit, token dapat terekspos ke target pengalihan
- URL authorize PoC menggunakan nilai berikut
client_id=0dcef4db-36d8-4aed-9cc5-ab43e1814884response_type=id_tokenredirect_uri=https://outlook-integration.harvestapp.com/auth/outlook-calendar/…?...scope=openidresponse_mode=fragmentstate=1nonce=123456
- Pengguna pada akhirnya diarahkan ke bentuk seperti berikut
https://example.com/.harvestapp.com/auth/… access token]&state=1
- Ini bukan kerentanan di sisi Microsoft
Waktu dari pelaporan hingga patch
- Tim Harvest sangat minim memberi respons dalam proses pengungkapan dan patch kerentanan, dan meski kerentanan sudah diakui melalui triage, perbaikannya memakan waktu lama
- Kerentanan dilaporkan pada 23 Agustus 2020, dan Harvest pertama kali menghubungi pada 16 Oktober 2020
- Pada 27 November 2020, laporan masuk status triaged
- Pada 28 April 2022, perusahaan mengatakan sedang melakukan perbaikan dan menyebut estimasi waktu 2 minggu, tetapi hingga perbaikan benar-benar dilakukan masih butuh sekitar 1 tahun lagi
- Pada 1 Agustus 2023, patch kerentanan dikonfirmasi
- Pada 21 Oktober 2023, laporan dipublikasikan melalui tulisan publik
- Per tanggal yang sama, laporan masih berstatus triage, dan meski kebijakan bug bounty menyebutkan imbalan, tidak ada bounty maupun poin HackerOne yang diberikan
- Setelah tulisan tersebut mendapat perhatian pada 22 Oktober 2023, Harvest meminta maaf dan menjelaskan bahwa keterlambatan itu disebabkan oleh human error
1 komentar
Opini Hacker News
Sebagai penanggung jawab program bug bounty, saya akan menjelaskan apa yang terjadi secara internal. Saya sudah meminta maaf kepada @0xcrypto dan menjelaskannya secara internal, tetapi saya rasa tepat juga untuk merangkumnya di sini
Sejak awal kami tidak bisa mereproduksi masalah ini sepenuhnya, dan kami juga tidak bisa menutupnya karena khawatir ada sesuatu yang terlewat. Tepat setelah jawaban terakhir kami bahwa “kami akan mencari solusi”, kami sudah hampir menyimpulkan bahwa masalah ini tidak dapat direproduksi, lalu ada laporan terkait OAuth yang mirip masuk sehingga terjadi kebingungan internal dan kami keliru mengira laporan ini sudah ditangani dan diteruskan
Karena pengaturan notifikasi, kami melewatkan pesan lanjutan, dan isu ini tetap berada dalam status Triage tanpa batas waktu tanpa pembaruan. Ini bukan alasan; saya sendiri sudah lama aktif sebagai pemburu bug bounty, jadi saya tahu betul betapa frustrasinya menunggu pembaruan dari perusahaan. Keamanan pelanggan adalah prioritas utama, dan apa yang tertulis di halaman keamanan kami benar adanya
Selain itu, sekarang juga belum jelas bagaimana laporan yang tidak dapat direproduksi lagi ini akan ditangani. Saya ingin membahasnya lebih lanjut di HackerOne, tetapi setelah pesan permintaan maaf, tampaknya kembali tanpa respons
Status aplikasi sering tidak sinkron dengan status server, dan perubahan di server baru terlihat setelah refresh paksa, atau perubahan di klien kembali seperti semula setelah disimpan. Pengalaman pengguna untuk pelacakan waktu juga tidak nyaman: tombol baru terlihat setelah menggulir, atau posisi tombol mulai/berhenti/mulai ulang/hapus terus berubah tergantung status item. Aplikasi lama memang tidak cantik, tetapi berfungsi tanpa masalah
Cukup mengkhawatirkan. Saat saya menggunakan Harvest, dukungannya benar-benar luar biasa, responsnya cepat, mereka memahami secara mendetail bagaimana pelanggan memakai produknya, dan juga menjelaskan secara rinci cara memanfaatkan fitur yang ada secara kreatif
Untuk fitur yang belum diimplementasikan, jawabannya adalah “akan kami masukkan ke backlog, tetapi tidak bisa dijamin”. Disebutkan bahwa jumlah staf engineering adalah 30 orang [1], tetapi saya tidak begitu tahu tenaga itu dipakai untuk apa, karena saya juga tidak melihat fitur lain dirilis dengan cepat
Sebagai “pengguna Harvest”, saya mulai menerima spam sehingga curiga apakah mereka menjual daftar pelanggan, tetapi para penanggung jawab perusahaan langsung menghubungi, membantah keras, dan menanganinya dengan serius sampai segera melakukan investigasi. Itu bagus
Namun pada akhirnya ini juga tampak seperti masalah engineering. Saya menemukan cara yang cukup mudah untuk memperkirakan pelanggan aktif, dan ini juga masuk ke “backlog” lalu belum diperbaiki selama berbulan-bulan. Perbaikannya tampak sangat sepele. Selain itu, MFA hanya disediakan saat login dengan Google [2]. Meski begitu, aplikasinya sendiri benar-benar sangat baik untuk tugas utamanya
1: https://www.getharvest.com/about/meet-the-team
2: https://support.getharvest.com/hc/en-us/articles/36005266713...
Miskomunikasi dengan pelapor di thread ini sepenuhnya adalah kesalahan saya, dan seperti yang saya jelaskan di jawaban teratas, saya akan memastikan hal seperti ini tidak terjadi lagi
Beberapa permintaan fitur bahkan masuk ke produk nyata. Mungkin bukan karena pengaruh saya, tetapi setidaknya tampaknya kami punya pemikiran yang mirip tentang pelacak waktu yang baik
Judulnya terasa cukup tidak adil terhadap Microsoft. Rasanya seperti memanfaatkan perhatian yang baru-baru ini tertuju pada Microsoft karena insiden autentikasi, dan begitu melihat judulnya saya langsung berpikir, “apakah ini pelanggaran MS lagi?”
Padahal sebenarnya itu adalah token Harvest, dan karena kerentanan injeksi pada kode Harvest, hanya hak akses aplikasi Harvest yang terekspos secara keliru. Kerentanannya akan sama saja meski berada di balik penyedia identitas lain
Kerentanan ini hanya berdampak pada implementasi OAuth untuk koneksi akun Microsoft. Judul awalnya adalah “Microsoft OAuth token leak via open redirect in Harvest App”, lalu saya ubah menjadi “Microsoft Account's OAuth tokens leaking via open redirect in Harvest App”. Saya masih berniat mengubahnya dan menerima saran
RFC 6749 membahas secara rinci cara server otorisasi mencegah serangan seperti ini
Server otorisasi wajib mengharuskan klien publik mendaftarkan URI pengalihan, dan sebaiknya juga mengharuskannya untuk klien rahasia. Jika URI pengalihan disediakan dalam permintaan, server otorisasi harus memverifikasinya dengan mencocokkannya terhadap nilai yang terdaftar
Kalau begitu, aplikasi Harvest seharusnya tidak mendaftarkan
redirect_uriberbahaya; jadi saya penasaran bagaimana ini bisa terjadi. Apakah server OAuth Microsoft mengabaikan parameter URL di dalamredirect_urisaat membandingkannya dengan URI pengalihan terdaftar milik klien OAuth?state. Mungkin tujuannya memang untuk mengalihkan ke mana sajaAlur yang dimaksud kira-kira: masuk ke URL otorisasi Harvest → dialihkan ke URL otorisasi Microsoft dengan
redirect_uri=registered_uridanstate=some_encoded_final_uri→ pengguna memasukkan kredensial → dialihkan ke URI terdaftar → membacastatelalu mengalihkan lagi ke URI di dalamnyaSerangan ini tetap mengalihkan ke URI yang diizinkan, tetapi endpoint tersebut membaca
statedan meneruskan respons/token apa adanya. Ada tiga kesalahan: penyalahgunaanstate, jika memang mau disalahgunakan seharusnyastatedienkripsi dan diverifikasi, serta mengaktifkan implicit grant. Jika diperlukan, seharusnya dibuat pendaftaran terpisah untuk penggunaan yang terbatasredirect_urimilik Harvest terdaftar di Microsoft. Setelah server OAuth Microsoft mengalihkan ke Harvest, Harvest mengimplementasikan redirect-nya sendiri berdasarkan data distateImplicit grant cukup mengerikan karena alasan seperti yang terlihat di tulisan ini
Sebagai catatan, ini akan dihapus dalam spesifikasi OAuth 2.1 yang segera hadir: https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-09.htm...
Maksudnya butuh 3 tahun untuk memperbaiki kerentanan ini? Dari Agustus 2020 sampai Agustus 2023, saya tidak tahu seberapa besar tim Harvest, tapi ini tetap terlihat benar-benar tidak masuk akal
Saya berharap ada pakar OAuth yang bisa menjelaskan masalah ini sedikit lebih detail. Saya sudah membaca blognya beberapa kali, tetapi masih belum memahami kerentanan sebenarnya
Dengan pengetahuan OAuth saya yang sangat terbatas, bukankah aplikasi Harvest meminta Microsoft memverifikasi pengguna, lalu setelah Microsoft memverifikasi pengguna, jika berhasil, Microsoft mengalihkan ke URL callback sambil mengirimkan access token dalam body respons?
Dalam kasus ini, bukankah penulis blog hanya membuat URL rakitan sendiri yang membuat URL pengembalian menuju example.com, bukan URL pengembalian sebenarnya?
harvestapp, dan bagian yang dikendalikan penyerang berada di dalamstate, yang bagi server OAuth hampir bersifat opaqueDengan URL itu, seseorang bisa mengirim tautan
login.microsoftonline.comkepada orang lain, menampilkan prompt login yang meminta “login ke Harvest”, lalu penyerang dapat memperoleh izin terkait akun Harvest yang sebenarnyaBiasanya ini tidak mungkin. Penyerang bisa mendaftarkan aplikasi baru yang diarahkan ke
example.com, tetapi itu tidak berguna karena mereka tidak akan mendapatkan access token berisi izin terkait HarvestAplikasi OAuth di sisi Microsoft memiliki daftar izin redirect yang valid, sehingga percobaan seperti
login.microsoftonline.com/authorize?client_id=$harvestAppID&redirect_uri=attacker.comakan menghasilkan error di sisi Microsoft. Serangan ini mungkin karena URLoutlook-integration.harvestapp.comyang valid menerima access token, lalu mengalihkan lagi ke situs penyerang sambil meneruskan access token tersebutoutlook-integration.harvestapp.com. Setelah callback OAuth2 berhasil, mereka menggunakan objek JSON sebagaistateyang berisi instruksi untuk dijalankanProperti
subdomaindigunakan untuk mengalihkan browser ke subdomainharvestapp.comsambil meneruskan#id-token. Masalahnya adalah nilaisubdomaindisisipkan begitu saja ke URL berikuthttps://${subdomain}.harvestapp.com/...#id-token=...
Jika
subdomaindalam payload JSON disetel ke nilai sepertiattacker-controlled.com/dengan garis miring di belakang, URL-nya menjadihttps://attacker-controlled.com/.harvestapp.com/...#id-token=.., dan browser berpindah ke domain lain sehingga token bocorJadi ini bukan masalah inheren OAuth itu sendiri, melainkan implementasi yang buruk
Saat menyiapkan workflow, alih-alih membuat daftar nyata URL callback tepercaya, mereka mungkin menggunakan wildcard di allowlist URL callback. Bisa saja saya sepenuhnya keliru
Tidak tahu mengapa mereka menunggu sampai 3 tahun. Masa tenggang sebelum pengungkapan publik 90 hari sudah cukup
Namun masa tenggang tambahan seperti itu seharusnya diberikan atas izin peneliti atau pengacara/perwakilannya. Untuk kasus yang lebih besar dari biasanya, ini adalah jenis permintaan yang bisa diajukan perusahaan dengan iktikad baik
Jika HackerOne membiarkan perusahaan menimbun hal seperti ini selama 3 tahun, rasanya mereka tidak menjalankan perannya dengan benar
Pada tingkat paling dasar, mereka hanya menyediakan platform pengungkapan kerentanan dan klausul hukum standar agar peneliti tidak dituntut oleh tim legal
Dalam sebagian besar kasus, perusahaan menolak permintaan pengungkapan. Jika peneliti mengungkapkannya tanpa izin, ia melanggar perjanjian dengan HackerOne dan perusahaan serta terekspos tanggung jawab hukum. Dalam kasus ini, tampaknya perusahaan menyetujui pengungkapan, dan meski responsnya sangat lambat, menurut saya poin itu patut diakui
Secara pribadi, saya juga beberapa kali mengalami bug dengan imbalan empat digit yang tidak diperbaiki selama lebih dari setahun, tetapi saya tidak menganggap itu salah HackerOne
HackerOne tidak peduli. Meski beberapa kali diberi tahu bahwa orang tersebut melanggar aturan mereka, mereka mengatakan tidak bisa melakukan apa-apa
Rasanya seperti perusahaan yang sudah mencapai kondisi operasional normal dipangkas hingga hanya menyisakan staf minimum, dengan petugas dukungan yang tidak punya wewenang menjawab pertanyaan. Itu sudah cukup lama, jadi mungkin sekarang sudah berubah, tetapi begitulah kesan saya saat itu
Jika perusahaan merasa HackerOne melewati batas dan menentukan apa yang “boleh” dilakukan perusahaan, mereka akan begitu saja meninggalkan HackerOne dan membuat solusi internal
Saya tidak mengerti mengapa isu ini tidak diteruskan ke Microsoft. Microsoft semestinya bisa mencabut hak akses aplikasi OAuth ini sampai masalahnya diperbaiki
Meski begitu, sepertinya ada ribuan implementasi serupa yang sama buruknya yang terhubung ke Microsoft lewat OAuth