Henry Expense là app ghi chép thu chi cá nhân trên iPhone. Dữ liệu thu chi được lưu trên máy của người dùng. Henry Expense chỉ có một máy chủ nhỏ cho tính năng Đồng bộ trực tiếp (api.henryexpense.com); máy chủ này chỉ giữ tạm giao dịch ngân hàng mới ở dạng mã hoá trên máy chủ (không phải mã hoá đầu-cuối), tối đa 7 ngày, tới khi app nhận. Nếu bạn tìm thấy lỗ hổng bảo mật, xin báo riêng cho nhà phát triển theo trang này để lỗ hổng được sửa trước khi công bố. Cảm ơn bạn đã giúp giữ an toàn cho người dùng.
Cách báo
- Gửi email tới [email protected], tiêu đề bắt đầu bằng [Security]. Viết bằng tiếng Việt hoặc tiếng Anh đều được.
- Nêu rõ: lỗ hổng ở đâu (app hay trang web, màn hình hoặc đường dẫn nào), phiên bản app (tab Khác -> Cài đặt -> Phiên bản), phiên bản iOS và đời máy, các bước làm lại, điều kẻ xấu làm được nếu khai thác, và ảnh chụp hoặc video nếu có.
- Không gửi dữ liệu tài chính thật, email ngân hàng thật, mật khẩu, API key hay mã OTP. Hãy che hoặc thay bằng giá trị giả. Hiện chưa có khoá mã hoá email; nếu bằng chứng buộc phải chứa dữ liệu nhạy cảm, hãy hỏi trước để thống nhất cách gửi.
- Một báo cáo cho một lỗ hổng. Nhiều lỗ hổng liên quan nhau thì nêu rõ mối liên quan.
Phạm vi
Trong phạm vi:
- App Henry Expense trên iOS, bản mới nhất trên App Store hoặc TestFlight. Ví dụ: vượt qua khoá app (PIN hoặc Face ID/Touch ID) hay thấy được nội dung tài chính khi app đang khoá; liên kết từ ngoài app mở được màn hình hay bật camera khi app đang khoá; dữ liệu rời máy mà chính sách quyền riêng tư không nêu, kể cả Trợ lý AI nhận dữ liệu bạn đã tắt chia sẻ; nội dung trang web hay email lừa được AI hoặc app ghi sai dữ liệu; token Gmail, API key AI, mã PIN hay khoá mã hoá dữ liệu bị lộ ra ngoài Keychain (vào nhật ký, thông báo lỗi, tệp sao lưu, tệp xuất); biên nhận, mã giao dịch hay bằng chứng mua của App Store bị ghi vào nhật ký, thông báo lỗi, tệp sao lưu hay tệp xuất; đọc được cơ sở dữ liệu hay bản sao lưu trong app mà không có khoá của máy, kể cả từ bản sao lưu iPhone trên máy tính; mở hoặc sửa được tệp sao lưu có mật khẩu mà không cần mật khẩu, hay sửa tệp mà app không phát hiện; dữ liệu bị mất hoặc bị ghi đè khi app chuyển dữ liệu cũ sang dạng mã hoá; app ghi đè hay xoá khoá mã hoá dữ liệu, hoặc hai iPhone cùng Apple ID làm mất dữ liệu của nhau qua khoá đồng bộ trong Chuỗi khoá iCloud; email giả mạo ngân hàng được tự ghi vào sổ hoặc tự gắn vào giao dịch có sẵn (thư chưa xác minh được người gửi vào hàng chờ duyệt kèm cảnh báo là đúng thiết kế); thư, mã QR hay tệp được tạo đặc biệt làm app chuyển khoản sai người nhận hoặc sai số tiền, hoặc làm app treo hay sập; tệp sao lưu, CSV hay Excel gây hại khi mở hoặc khi nhập lại.
- Trang henryexpense.com và các trang con, kể cả khung tải thư mẫu (.eml) ở trang Đồng bộ ngân hàng. Ví dụ: chèn mã độc (XSS), xem được tệp người khác đã tải lên, cấu hình trang hay khung tải lên làm lộ tệp hoặc nội dung form.
- Máy chủ Đồng bộ trực tiếp api.henryexpense.com (và bản thử api-uat.henryexpense.com), kể cả trang liên kết (đường dẫn /link và /link/return), địa chỉ nhận giao dịch từ đối tác (đường dẫn /hook/tx/...) và lệnh xác nhận đã nhận giao dịch (/v1/transactions/ack). Ví dụ: dùng được máy chủ mà không có thuê bao hợp lệ, bằng bằng chứng mua giả, đã hết hạn, đã hoàn tiền hay của sản phẩm khác; đọc, xoá hay làm mất giao dịch, tài khoản đã liên kết hay phiên liên kết của người khác, hoặc liên kết hay gỡ tài khoản ngân hàng thay người khác; đưa giao dịch giả vào hàng chờ của người khác qua địa chỉ nhận giao dịch, hay đoán được địa chỉ hoặc mã bí mật của nó; đọc được nội dung hàng chờ mà không có khoá của máy chủ; máy chủ trả số tài khoản đầy đủ, khoá của đối tác hay thông điệp gốc của đối tác; trang liên kết bị chèn mã, chuyển hướng tới trang lạ hay làm lộ địa chỉ trang của đối tác; app gửi bằng chứng mua tới nơi khác ngoài máy chủ.
Ngoài phạm vi (vui lòng không báo các mục sau ở đây; không kiểm thử dịch vụ của bên thứ ba qua chương trình này):
- Dịch vụ của bên thứ ba mà app hay trang web dùng: Google và Gmail, Apple, Expo (u.expo.dev), Netlify, Cloudflare, dl.vietqr.io, đối tác kết nối ngân hàng của Đồng bộ trực tiếp (trang liên kết ngân hàng và dịch vụ của họ), nhà cung cấp AI, nguồn tỷ giá và giá tài sản, app ngân hàng. Lỗi của họ xin báo cho chính họ. Cách app và trang web dùng các dịch vụ này vẫn trong phạm vi, ví dụ app tin dữ liệu sai từ nguồn giá hay từ AI, đăng nhập Google bị chặn giữa đường, hay cấu hình khung tải tệp làm lộ tệp.
- Lỗi chỉ xảy ra trên máy đã jailbreak, lỗi của chính iOS, hoặc tấn công vào phần cứng. Người cầm iPhone đang mở khoá mà vượt được khoá app Henry Expense thì vẫn trong phạm vi.
- Vượt khoá tính năng trả phí ngay trên máy của chính bạn (máy đã jailbreak, app bị sửa hay bị chèn mã), hoặc mở tính năng trả phí bằng mua thử miễn phí qua TestFlight. Đọc được số hotline hỗ trợ từ tệp cài app hay mã của app khi chưa mua: số này không phải bí mật, app chỉ không hiện nó trước khi mua. Dùng được máy chủ Đồng bộ trực tiếp mà không có thuê bao hợp lệ thì vẫn trong phạm vi.
- Tấn công làm sập trang web hay dịch vụ (DoS), gửi hàng loạt yêu cầu hay hàng loạt tệp, thư rác, lừa đảo người dùng hay nhà phát triển.
- Kết quả quét tự động chưa chứng minh được tác hại: thiếu header bảo mật, clickjacking ở trang không có thao tác nhạy cảm, lộ phiên bản phần mềm, cấu hình TLS, bản ghi SPF/DMARC/DKIM của tên miền, self-XSS, lỗ hổng đã công bố của thư viện mà không chứng minh được app hay trang web bị ảnh hưởng.
- Thư đến từ địa chỉ người gửi mà chính bạn đã thêm vào danh sách nguồn Gmail của app.
- Giới hạn đã được ghi rõ trong chính sách quyền riêng tư, ví dụ tệp CSV/Excel không có mật khẩu, tệp sao lưu cũ không có mật khẩu do bản cũ của app tạo, đoán được mật khẩu yếu của tệp sao lưu bằng máy khác, dữ liệu không mở được trên iPhone mới khi chuyển bằng bản sao lưu iCloud hay bản sao lưu máy tính không mật khẩu mà khoá không có trong Chuỗi khoá iCloud (khác Apple ID hoặc tắt Chuỗi khoá iCloud), phải chờ khoá đồng bộ rồi thử lại sau khi khôi phục từ iCloud, app tự hỏi máy chủ Expo về bản cập nhật, hay liên kết ở đối tác không tự gỡ khi thuê bao Đồng bộ trực tiếp hết hạn.
Quy tắc khi kiểm thử
- Chỉ kiểm thử trên máy, dữ liệu và tài khoản của chính bạn. Chỉ dùng API key AI, tài khoản Google, thuê bao Đồng bộ trực tiếp (kể cả mua thử qua TestFlight) và tài khoản ngân hàng của chính bạn. Không dùng dữ liệu thật của người khác.
- Thử email giả mạo ngân hàng: chỉ gửi tới hộp thư của chính bạn, không gửi thư mạo danh ngân hàng tới người khác. Thử chuyển khoản QR: không chuyển tiền thật tới tài khoản của người khác.
- Không xem, sửa hay xoá dữ liệu của người khác. Lỡ thấy dữ liệu của người khác thì dừng lại, không lưu, không chia sẻ, và báo ngay.
- Khung tải thư mẫu trên trang web: chỉ gửi vài lượt thử, dùng tệp tự tạo không chứa dữ liệu thật, ghi "SECURITY TEST" ở ô ghi chú. Không tải lên mã độc.
- Không làm gián đoạn trang web hay ảnh hưởng tới người dùng khác.
- Giữ kín thông tin về lỗ hổng cho tới khi đã sửa xong hoặc hai bên thống nhất ngày công bố.
- Không đòi tiền hay điều kiện để đổi lấy việc không công bố.
Sau khi bạn báo
- Thường trong 7 ngày (lâu hơn nếu nhà phát triển đi vắng): nhà phát triển trả lời xác nhận đã nhận báo cáo.
- Trong 30 ngày: báo cho bạn kết quả đánh giá và mức độ nghiêm trọng.
- Mục tiêu sửa trong 90 ngày kể từ khi xác nhận. Lỗi của app cần Apple duyệt bản cập nhật nên có thể lâu hơn lỗi của trang web; nhà phát triển cố gắng báo bạn tiến độ khoảng mỗi 30 ngày.
- Khi đã sửa, bạn được báo và có thể công bố sau khi bản sửa đã tới người dùng, hoặc vào ngày hai bên thống nhất.
- Nếu muốn, tên hoặc biệt danh của bạn được ghi nhận trong ghi chú phát hành của bản sửa, hoặc trên trang này với lỗi của trang web.
Tiền thưởng
Henry Expense là dự án của một nhà phát triển cá nhân, hiện chưa có chương trình trả tiền thưởng cho lỗ hổng. Mọi báo cáo hợp lệ đều được cảm ơn và ghi nhận nếu bạn muốn.
Nghiên cứu thiện chí
Nếu bạn kiểm thử thiện chí, chỉ trên những phần nêu ở mục Phạm vi và làm đúng các quy tắc trên, nhà phát triển coi đó là việc được phép, sẽ không khởi kiện hay khiếu nại bạn vì việc đó, và sẽ làm việc với bạn để hiểu và sửa lỗi nhanh. Cam kết này chỉ thay mặt nhà phát triển Henry Expense, không thay mặt bên thứ ba (Apple, Google, Netlify…) và không thay cho quy định pháp luật. Nếu chưa chắc một việc có nằm trong quy tắc không, hãy hỏi trước qua email.
Tệp security.txt
Thông tin liên hệ bảo mật dạng máy đọc được có tại https://henryexpense.com/.well-known/security.txt (theo chuẩn RFC 9116).
Henry Expense is a personal income and expense app for iPhone. Your financial data is stored on your device. Henry Expense has only one small server, for the Direct sync feature (api.henryexpense.com); this server only holds new bank transactions briefly, encrypted on the server (not end-to-end encrypted), for up to 7 days, until the app receives them. If you find a security vulnerability, please report it privately to the developer as described on this page, so it can be fixed before it is made public. Thank you for helping keep our users safe.
How to report
- Email [email protected] with a subject starting with [Security]. Vietnamese or English is fine.
- Include: where the issue is (app or website, which screen or URL), the app version (More tab -> Settings -> Version history), your iOS version and device model, steps to reproduce, what an attacker could do with it, and screenshots or a video if you have them.
- Do not send real financial data, real bank emails, passwords, API keys or one-time codes. Mask them or use fake values. There is no email encryption key yet; if your proof must contain sensitive data, ask first so we can agree on how to send it.
- One report per issue. If several issues are related, say how.
Scope
In scope:
- The Henry Expense iOS app, latest version on the App Store or TestFlight. Examples: bypassing the app lock (PIN or Face ID/Touch ID) or seeing financial data while the app is locked; a link from outside the app opening a screen or turning on the camera while the app is locked; data leaving the device that the privacy policy does not mention, including the AI assistant receiving data you turned off sharing for; web pages or emails tricking the AI or the app into saving wrong data; the Gmail token, an AI API key, the PIN or the data encryption key leaking out of the Keychain (into logs, error messages, backups or exports); App Store receipts, transaction IDs or purchase proofs being written to logs, error messages, backups or exports; reading the database or the in-app backups without the device key, including from an iPhone backup on a computer; opening or changing a password-protected backup file without the password, or changing a file without the app noticing; data being lost or overwritten while the app converts old data to the encrypted form; the app overwriting or deleting the data encryption key, or two iPhones with the same Apple ID making each other lose data through the key synced in iCloud Keychain; a spoofed bank email being recorded automatically or linked to an existing transaction (unverified emails going to the review queue with a warning is by design); a crafted email, QR code or file making the app send a transfer to the wrong recipient or amount, or making the app hang or crash; backup, CSV or Excel files that cause harm when opened or imported again.
- The website henryexpense.com and its pages, including the sample email (.eml) upload box on the bank sync page. Examples: cross-site scripting (XSS), seeing files uploaded by other people, site or upload box settings that expose files or form contents.
- The Direct sync server api.henryexpense.com (and the test server api-uat.henryexpense.com), including the link pages (the paths /link and /link/return), the address that receives transactions from the partner (the path /hook/tx/...) and the call that confirms transactions were received (/v1/transactions/ack). Examples: using the server without a valid subscription, with a fake, expired or refunded purchase proof or one for another product; reading, deleting or causing the loss of other people's transactions, linked accounts or link sessions, or linking or unlinking a bank account on someone else's behalf; putting fake transactions into someone else's queue through the receiving address, or guessing that address or its secret code; reading the queue content without the server's key; the server returning a full account number, the partner key or the partner's original messages; the link page being injected with code, redirecting to an unknown page or leaking the address of the partner page; the app sending the purchase proof anywhere other than the server.
Out of scope (please do not report these here; do not test third-party services through this program):
- Third-party services used by the app or website: Google and Gmail, Apple, Expo (u.expo.dev), Netlify, Cloudflare, dl.vietqr.io, the bank-connection partner of Direct sync (its bank link pages and services), AI providers, exchange rate and asset price sources, bank apps. Please report their issues to them. How the app and website use these services is still in scope, for example the app trusting bad data from a price source or an AI provider, the Google sign-in being intercepted, or the upload box settings exposing files.
- Issues that only happen on a jailbroken device, bugs in iOS itself, or attacks on the hardware. Someone holding an unlocked iPhone who gets past the Henry Expense app lock is still in scope.
- Getting past the lock on paid features on your own device (a jailbroken device, or a modified or injected app), or unlocking paid features with free test purchases through TestFlight. Reading the support hotline number from the app package or the app code before buying: this number is not a secret, the app only does not show it before you buy. Using the Direct sync server without a valid subscription is still in scope.
- Denial of service against the website or services, sending large numbers of requests or files, spam, social engineering of users or the developer.
- Automated scanner results without a demonstrated impact: missing security headers, clickjacking on pages without sensitive actions, software version disclosure, TLS configuration, SPF/DMARC/DKIM records of the domain, self-XSS, published vulnerabilities in libraries without showing that the app or website is affected.
- Emails from a sender address that you added yourself to the app's Gmail source list.
- Limitations already stated in the privacy policy, such as CSV/Excel files having no password, old backup files without a password made by older versions of the app, guessing a weak backup file password on another device, data not opening on a new iPhone after a transfer with an iCloud backup or a computer backup without a password when the key is not in iCloud Keychain (a different Apple ID, or iCloud Keychain turned off), having to wait for the key to sync and try again after restoring from iCloud, the app asking the Expo server for app updates, or the link at the partner not being removed automatically when the Direct sync subscription expires.
Testing rules
- Only test with your own device, data and accounts. Use only your own AI API key, Google account, Direct sync subscription (including test purchases through TestFlight) and bank accounts. Do not use other people's real data.
- Spoofed bank emails: send them only to your own mailbox, never to anyone else. QR transfers: do not send real money to other people's accounts.
- Do not view, change or delete other people's data. If you see someone else's data by accident, stop, do not keep or share it, and report it right away.
- Sample email upload box on the website: send only a few test submissions, use files you made yourself with no real data, and write "SECURITY TEST" in the note field. Do not upload malware.
- Do not disrupt the website or affect other users.
- Keep the details private until the issue is fixed or we agree on a disclosure date.
- Do not ask for money or conditions in exchange for not disclosing.
After you report
- Usually within 7 days (longer if the developer is away): the developer confirms that your report was received.
- Within 30 days: you get the assessment result and severity.
- We aim to fix within 90 days of confirming. App fixes need Apple to review an update, so they can take longer than website fixes; the developer tries to update you on progress about every 30 days.
- When it is fixed, you are told, and you may publish after the fix has reached users, or on a date we agree on.
- If you wish, your name or handle is credited in the release notes of the fix, or on this page for website issues.
Rewards
Henry Expense is run by a single independent developer and has no paid bug bounty program at this time. Every valid report is appreciated and credited if you wish.
Good-faith research
If you test in good faith, only the parts listed under Scope, and follow the rules above, the developer considers your research authorized, will not take legal action or file complaints against you for it, and will work with you to understand and fix the issue quickly. This commitment is made only on behalf of the Henry Expense developer, not on behalf of third parties (Apple, Google, Netlify…), and does not replace the law. If you are unsure whether something is allowed, ask first by email.
security.txt file
Machine-readable security contact information is available at https://henryexpense.com/.well-known/security.txt (following RFC 9116).