New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 746427 link

Starred by 4 users

Issue metadata

Status: Assigned
Owner:
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: Android
Pri: 2
Type: Bug-Security



Sign in to add a comment

Are some tel: links a security issue on Android?

Project Member Reported by rbyers@chromium.org, Jul 19 2017

Issue description

Firefox considers tel: links with '*' or '#' in them invalid because they claim they can be abused on some phones: https://bugzilla.mozilla.org/show_bug.cgi?id=794034

What's Chrome's opinion on this?  At https://s.codepen.io/rbyers/debug/OgraYM/dXAqBbnNGZxk I included an example that is supposed to be the "factory reset code" for the Galaxy S3 and Chrome happily opened it in the dialer.

Here's one list of such special code:
http://www.mobilefun.co.uk/blog/2014/07/try-these-secret-dialer-codes-on-your-htc-or-samsung-android-phone/

Should we consider, for example, refusing to activate tel: links that START with a '*' or '#'?  I'd like to come up with something that we can agree on with other Android browsers for maximum interop (eg. the differences are causing pain for the Google hangouts team).

Using 'allpublic' since this was discussed on public Firefox bugs  5  years ago.
 

Comment 1 by rbyers@chromium.org, Jul 19 2017

Labels: Hotlist-Interop
Labels: Security_Severity-Low Security_Impact-Stable
Owner: aelias@chromium.org
Status: Available (was: Untriaged)
Since this has been public for 5 years, marking this low severity.

Comment 3 Deleted

Comment 4 by aelias@chromium.org, Jul 19 2017

I understand the main problem with Firefox for Android's restriction is that '#' can legitimately appear in extension codes following the phone number proper.  A safe example desired to work is <a href="tel:+12505555555;1234#">Example</a>.

The implementation work to add a restriction in Chrome should be easy, the main blocker is to get a consensus about what exact one we should go with.
Project Member

Comment 5 by sheriffbot@chromium.org, Jul 20 2017

Labels: -Pri-3 Pri-2
Project Member

Comment 6 by sheriffbot@chromium.org, Jul 20 2017

Status: Assigned (was: Available)

Comment 7 Deleted

The "Magic" dialer codes all seem to start with * or #, which might be one simple way they could be distinguished from dialing use cases that are more likely to be legitimately used?

Comment 9 by erikay@google.com, Jul 20 2017

To provide some context on why this is useful, we have a web page of different phone numbers that you can call to join a meeting by phone. This includes an international phone number + 13 digit PIN which is very tedious to input (and prone to error). To help alleviate this pain point, we would like users to be able to simply tap on the phone number for their country that would open the dialer app and pass through the <phone number>,<pin># so that the user doesn't need to manually type anything in. For us, it is important that at least this functionality is maintained even if other abuse prevention mechanisms are put into place. Thanks!
Owner: ----
Status: Available (was: Assigned)

Comment 11 by f...@chromium.org, Feb 14 2018

Labels: -Security_Severity-Low Security_Severity-Medium
Even though this requires explicit user interaction, the end result is so bad that I think we should think of this as medium-severity.
Project Member

Comment 12 by sheriffbot@chromium.org, Feb 15 2018

Labels: M-65
Cc: -aelias@chromium.org tedc...@chromium.org mariakho...@chromium.org
+some Android folks since aelias@ has left Chromium. WDYT about restricting the digits that can appear in tel:// links on Android? Should we move towards parity with iOS here, or Firefox, or other browser on Android?
Do we know if anyone besides Firefox does anything for this? What do they do?

IMO, I am less concerned with having this be standard across browsers and more concerned with exposing our users to potential exploits. On the other hand, I don't want to break useful legit phone numbers by blocking all */# numbers.

My gut feeling based on looking at the linked lists is to go with checking that a number has any two of (* or #) anywhere in the number and if so, block it. Feels weird and hacky, but honestly so is the rest of our intent handling code anyway.

Another option is to log how often dispatched tel: links contains * or #, if the counts are super low today, we could just block all outright, knowing we affect very few people. But getting that data would take awhile.

Thouhts?
Cc: domenic@chromium.org rbyers@chromium.org
This issue went to the working group: https://github.com/whatwg/html/issues/2875

It seems the iOS and Firefox are blocking URIs with # and *, which has a functional impact, but given that it sounds like Chrome's the straggler here, the compatibility implications are probably not so bad.

Firefox does this:

    static boolean isUriSafeForScheme(Uri aUri) {
        //  Bug 794034  - We don't want to pass MWI or USSD codes to the
        // dialer, and ensure the Uri class doesn't parse a URI
        // containing a fragment ('#')
        final String scheme = aUri.getScheme();
        if ("tel".equals(scheme) || "sms".equals(scheme)) {
            final String number = aUri.getSchemeSpecificPart();
            if (number.contains("#") || number.contains("*") || aUri.getFragment() != null) {
                return false;
            }
        }
        return true;
    }
If we want to understand the impact, we could add a UKM UseCounter for tel links with '#' or '*' and then look at the URLs we get back.  I suspect we would break some legitimate usage that somebody somewhere will care a lot about, and not sure we'd actually protect any malicious usage (since we haven't gotten any reports AFAIK). Given how little Firefox is used on mobile, I don't think we can count on their behavior being meaningful from a web compat perspective.

Matching iOS would be a more compelling argument, but it sounds like on iOS there's maybe just one additional tap required to dial (not blocked completely)?
I'm somewhat indifferent just to weigh my opinion.  I agree with Maria on the hacky option likely being the best/least invasive (i.e. the one we could probably add very quickly with no risk).

My larger concern is handling the rejected case.  Are we going to need to show a message?  A toast?  Do we need to show a snackbar or infobar or something allowing them to proceed anyway?  Is silently ignoring it ok (I wouldn't think so).

Dialers should be able to distinguish external browser intents by looking for Intent.CATEGORY_BROWSABLE.  In cases where a dialer allows incoming intents to trigger potentially dangerous setup/debug code paths, I'm not going to give a ton of sympathy.

I'd be fine to add some bit of sanity checking to try and help other devs, but I personally wouldn't feel the need to add a ton of logging and drag this process out.
Testing this on Android 8.1.0, it appears that when following a "tel:" link anything after and including the first '#' is stripped when it arrives at the dialer, and the dialer does not automatically perform the call (this puts it in line with the iOS dialing behavior of showing a confirmation popup).

This would still allow codes that include only '*' and numbers, but I don't know of any potentially harmful ones that never include a '#' (which means a user would have to additionally add the '#' and anything after it for it to work).

If we wanted to explicitly stop these from opening the dialer at all on the Chrome side of things, we could maybe add a check to ExternalProtocolHandler::LaunchUrl() to block URLs that have the 'tel:' scheme and start with some form of "*" or "#" or "//*" or "//#".

We might want to also put that behind a feature flag in case we needed to disable the blocking if there's some unexpected breakage, but the fact that any input after the first '#' is stripped anyway seems like it is already breaking existing desired flows (such as the one mentioned in #4).
Cc: cthomp@chromium.org
Project Member

Comment 20 by sheriffbot@chromium.org, Apr 19 2018

Labels: -M-65 M-66
Owner: cthomp@chromium.org
Status: Assigned (was: Available)
cthomp - can we find an owner for this until it is driven to completion?
Project Member

Comment 22 by sheriffbot@chromium.org, May 3 2018

cthomp: Uh oh! This issue still open and hasn't been updated in the last 40 days. This is a serious vulnerability, and we want to ensure that there's progress. Could you please leave an update with the current status and any potential blockers?

If you're not the right owner for this issue, could you please remove yourself as soon as possible or help us find the right one?

If the issue is fixed or you can't reproduce it, please close the bug. If you've started working on a fix, please set the status to Started.

Thanks for your time! To disable nags, add the Disable-Nags label.

For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
Project Member

Comment 23 by sheriffbot@chromium.org, May 17 2018

cthomp: Uh oh! This issue still open and hasn't been updated in the last 54 days. This is a serious vulnerability, and we want to ensure that there's progress. Could you please leave an update with the current status and any potential blockers?

If you're not the right owner for this issue, could you please remove yourself as soon as possible or help us find the right one?

If the issue is fixed or you can't reproduce it, please close the bug. If you've started working on a fix, please set the status to Started.

Thanks for your time! To disable nags, add the Disable-Nags label.

For more details visit https://www.chromium.org/issue-tracking/autotriage - Your friendly Sheriffbot
Project Member

Comment 24 by sheriffbot@chromium.org, May 30 2018

Labels: -M-66 M-67
Project Member

Comment 25 by sheriffbot@chromium.org, Jul 25

Labels: -M-67 Target-68 M-68
Project Member

Comment 26 by sheriffbot@chromium.org, Sep 5

Labels: -M-68 M-69 Target-69
Project Member

Comment 27 by sheriffbot@chromium.org, Oct 17

Labels: -M-69 Target-70 M-70
Given that links with # don't work on iOS, Firefox and Android 8.1+, it sounds reasonable to me to drop it from Chrome. Can we do that? (I'm happy to approve an ExternalProtocolHandler CL that does that)
Since we know of some legitimate use cases with # in the number somewhere, I think dropping that will be subject to the blink breaking change process (https://www.chromium.org/blink/removing-features).

But AFAIK we know of no legitimate use case for numbers that start with #, so just breaking those can probably be considered "trivial" IMHO and something we just land and listen for any feedback on.

Project Member

Comment 30 by sheriffbot@chromium.org, Dec 5

Labels: -M-70 Target-71 M-71

Sign in to add a comment