手帶 app 有幾安全?

Alex Lau

Alex Lau

2020-03-26

簡述:給不是IT人的你

香港政府的手帶 App 可能因「貪方便」而使用了一個名為 Humayan Kabir 的孟加拉開發者的程式碼,所以現在全香港《居安抗疫》資料,都掌握在這位外國勢力手上。甚至乎明天他加上要求大家輸入信用卡資料的空格,也是絕對可行的。

此乃屬於嚴重安全漏洞。在政府未修正這問題之前,盡可能不要在此程式中輸入任何敏感的個人資料。

如果你有興趣知道更多這漏洞的原理,請繼續往下閱讀。


今早,筆者發現監察手帶 app 《居安抗疫》的下載頁問題之後,想起有網民表示連遞交表格都不成功,於是就嘗試下載這個《居安抗疫》程式的 Android 版,把它 decompile (反向編譯),看一看箇中問題,希望為 OGCIO (政府資訊科技總監辦公室) 找一些 bugs,然後讓有手帶的人成功遞交表格,怎料卻發現嚴重漏洞

先發現一個網頁表格

原本只是找一找遞交表格的伺服器 Endpoint,看看會不會有些 Error Code 能找到端倪。怎料在 RegisterInfoActivity.java 這個 Android 畫面上(Android 中所有用戶能看到的畫面都稱為 Activity),看到有一個類似 WebView 的東西,應該是當用戶掃描 QR Code 後,便會引導到一個網頁中繼續填寫資料。

  WebView webView = this.f2688t;
  String a = C0881b.m2198a(this);
  List<String> list2 = this.f2693y;
  StringBuilder sb = new StringBuilder();
  boolean z = false;
  for (String str : list2) {
      if (z) {
          sb.append("||");
      }
      sb.append(str);
      z = true;
  }
  C2231a aVar2 = new C2231a();
  aVar2.mo5010c("https");
  aVar2.mo5009b("eqapp1.hqss.ogcio.gov.hk");
  String str2 = "/shs/www/equar/index";
  int i = 0;
  while (true) {
      int a2 = C2124e.m4129a(str2, i, 20, "/\\");
      int i2 = a2;
      aVar2.mo5008a(str2, i, a2, a2 < 20, false);
      i = i2 + 1;
      if (i > 20) {
          break;
      }
  }
  aVar2.mo5006a("www_header_token", "ODk1MGQwNzkyZmIxM2Q4MjI0ZjQxY2U4");
  aVar2.mo5006a("lang", a);
  aVar2.mo5006a("user_sn", sb.toString());
  aVar2.mo5006a("info.family", String.valueOf(list2.size()));
  webView.loadUrl(aVar2.mo5007a().f6202i);

發現網頁表格的問題

在手機 app 中使用網頁來讓用戶填寫資料本來沒有什麼問題,還節省了開發成本,讓 iOS 和 Android 兩個平台都能夠使用得到。不過當我們打開這個網頁時,便發現有一個很嚴重的問題,以下為網頁的部份原始碼:

  <script src="https://technext.github.io/drug/js/vendor/modernizr-3.5.0.min.js"></script>
  <script src="https://technext.github.io/drug/js/vendor/jquery-1.12.4.min.js"></script>
  <!--script(src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/esm/popper.js')-->
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
  <!--script(src='https://technext.github.io/drug/js/isotope.pkgd.min.js')-->
  <script src="https://technext.github.io/drug/js/ajax-form.js"></script>
  <script src="https://technext.github.io/drug/js/waypoints.min.js"></script>

這部份是一些加入其他網站 JavaScript 的 HTML。在一般情況下,我們會使用其他開發者所創立的組件 (Framework/Library),減省我們自己開發的時間。不過,由於很多任何人都能夠公布組件,我們永遠不知道有沒有不懷好意的開發者,在他們的 JavaScript 中放入惡意代碼,所以我們使用任何人的組件時,必須選擇有信譽和來源可靠的組件。

而這個 app 用的是什麼組件呢?驟眼一看,modernizr、jquery、bootstrap 都是常見的工具,很多網站都有使用。

不過,部份工具的來源,卻是來自一個叫 technext.github.io 的網站,這個網站是誰控制的呢?是不是政府擁用的?

所有 github.io 其實都是由著名網站 Github 提供的免費寄存服務,我們可以輕易把網址改一改動,就知道這個寄存空間的擁用人是誰,只要把 github.io 前置的名字,改為 https://github.com/名字 就能找到。於是,我們一起來看看 https://github.com/technext 到底是何許人:

Screen Shot 2020-03-26 at 2.52.59 PM.png

竟然是一位名為 Humayun kabir 的孟加拉開發者。

有可能發生的安全漏洞

如果這個 technext.github.io 的擁用權是在政府手上,其實問題不大。不過,我相信以 Humayun kabir 為名的開發者帳戶,理應不受政府控制。而該網站存放的 modernizr、jquery,可以無需通知 OCGIO的情況下,任何修改,甚至加入惡意程式碼!

這是十分典型的 Cross-site Scripting Attack:

sorted-XSS.png

圖片來源:https://www.imperva.com/learn/application-security/cross-site-scripting-xss-attacks/

根據著名網絡公司 Mozilla 的安全評級,以上的 Cross-site Scripting 屬於最高級別的「嚴重級」。

換句話說:如果 Humayun kabir 得知自己的工具被香港政府使用,然後偷偷地加入新的代碼,背後偷取手帶人士的個人資料,或者甚至在表格上加上一兩個詢問個人資料的空格,再繞過政府自行收集,是絕對可行的。

而在用戶使用的途中,是完全不會察覺,亦不會知道這個表格有沒有連接上政府以外的其他伺服器

這開發者未必知情

倘若政府是聘請了這位孟加拉開發者,使用他寄放的工具,或許政府與他之間有些協議,可能還是對用家有一點點保障。

不過,我們再細心一看原本使用這工具來源的網站: http://technext.github.io/drug

Screen Shot 2020-03-26 at 3.13.22 PM.png

這網站顯然是一個平常不過的 template 網站,應該是普遍用來方便開發者架設網站的樣版。有很可能是開發《居安抗疫》的公司同事,為圖方便起見,直接使用了 template 網站的工具來開發。

建議解決方法

其實,modernizr、jquery、bootstrap 這三個工具都是四處可以找到其他可靠的來源下載,倘若能放在 OCGIO 的伺服器之上,根本就可以簡單消除這漏洞。

而其中一個 ajax-form.js,這個很可能是 app 開發者最希望使用到的工具,而其他的工具就正是因為這個 ajax-form.js 需要用到,才一併加入。我們發現 ajax-form.js 只是一個不多於 50 行的 Contact Form 聯絡我們輔助代碼,如果是直接抄過來《居安抗疫》,可能有版權問題,但 50 行的代碼,由開發者親自操刀也不是難事。

結語

希望政府盡快更新有關網站表格,由於表格不是依附在 app 之中,照道理無需經過 App Store 和 Play Store 審查已經可以直接更新,並更新有關網絡安全的要求,好讓香港的科技發展不會淪為別國的笑柄。

Comments

Read More

常見的 Bootstrap 新手中伏位:從手帶 app (居安抗疫) 下載頁一齊睇

為家人添置多一個新聞選擇 —— 利用 Raspberry Pi 接駁 NowTV 新聞台上電視

軟件工程師成長手冊

HTTP:互聯網的共同語言