Intent to Deprecate: Nonsecurely delivered cookies.

688 views
Skip to first unread message

Mike West

unread,
Apr 6, 2018, 9:29:53 AM4/6/18
to blink-dev
# Primary eng (and PM) emails
mk...@chromium.org, tna...@chromium.org


# Explainer
https://github.com/mikewest/cookies-over-http-bad/


# Summary
Rather than sending sufficiently-old cookies over non-secure connections, we should instead delete them from the user's cookie jar. That is, when connecting to `http://example.com/`, we build a `Cookie` header: if any cookie we'd put into that header is sufficiently old, we exclude it from the header, and delete it entirely.

We should set the age bar at something large to start (say, a year), and ratchet it down over time until we reach something sufficiently small to mitigate the risks that cookies delivered over non-secure connections present (the process of deploying Chrome's "Not Secure" label is a good example here).


# Motivation
Cookies sent over plaintext HTTP are visible to anyone on the network. This visibility exposes substantial amounts of data to network attackers (passive or active). We know, for example, that long-lived and stable cookies have enabled pervasive monitoring in the past (see Google's PREF cookie), and we know that HTTPS provides significant confidentiality protections against this kind of attack.

Ideally, browsers would mitigate these monitoring opportunities by making it more difficult to persistently track users via cookies sent over non-secure connections.


# Interoperability and Compatibility Risk
In general, cookies are a somewhat fragile state management mechanism, which can be evicted for many reasons, ranging from a users' manual intervention to extensions to middleboxes to eviction. This first phase has a long-enough lifetime that I expect the interop risk to be low enough to accept (see the UseCounter section below for data).

Likewise, the first phase's lifetime minimizes the user-visible impact with the intent of giving developers time to adjust while we work out a longer-term deprecation schedule based on feedback we receive in this first phase. Authenticating to a website once a year if your auth cookie is removed doesn't seem like much of a burden to impose.

Edge: No signals.

Firefox: Mozilla has poked at (at least?) two different variants of this general theme, https://groups.google.com/d/msg/mozilla.dev.platform/OrUOw3ag258/Te3rqqRLAgAJ and https://groups.google.com/d/msg/mozilla.dev.platform/xaGffxAM-hs/aVgYuS3QA2MJ, which aimed to turn cookies into session cookies in various cases. In the intervening ~2 years, the web has shifted significantly towards TLS, which reduces the user-facing impacts to the point that I'm hopeful they'll be comfortable trying again.

Safari: No signals.


# Alternative implementation suggestion for web developers
Developers can migrate to HTTPS. Alternatively, if they must remain on HTTP for one reason or another, they can adopt a rotation strategy similar to Doubleclick's `ID` cookie, which is re-encrypted on a ~daily basis.


# Usage information from UseCounter
`Cookie.AgeForNonSecureCrossSiteRequest` and `Cookie.AgeForNonSecureSameSiteRequest` track the age (in days) of the oldest cookie associated with each request. In March, 2018 the percentile buckets break down as follows:

Same-site Requests
* 20% = 0-1 days
* 40% = 2-3 days
* 60% = 37-42 days
* 80% = 120-135 days
* 90% = 273-307 days
* 93.88% = 345-388 days
* 95% = 437-492 days
* 99% = 701-789 days

Cross-site Requests
* 20% = 2-3 days
* 40% = 37-42 days
* 60% = 95-107 days
* 80% = 192-216 days
* 90% = 307-345 days
* 92.7% = 345-388 days
* 95% = 437-492 days
* 99% = 701-789 days

While I'd like to get the lifetime of non-secure cookies down to something very small indeed, I'd also like us to be careful about how we approach this. In the same way that we've slowly ratcheted up on the "Not Secure" display in the omnibox, I'd suggest that starting with a large number and moving it down over time would be a reasonable approach. A year, for example, would have a one-time effect on ~6.12% of same-site requests, and ~7.3% of cross-site requests. That seems like a reasonable starting point to me.

These metrics are, unfortunately, not UseCounter based, so it's a bit difficult to give a percentage of page views that would be affected, or to break things down by origin. HTTP Archive is similarly not terribly useful, as its crawler does not have enough of a lifetime to give us any indication about which cookies are long-lived.

tnagel@ is adding additional metrics to see what the impact would be if we tightened the restrictions suggested here to include other at-risk cookies which aren't protected by either the `Secure` attribute or HSTS. If it turns out that the numbers look reasonable, we'll come back to this list with an adjusted proposal.


# Entry on the feature dashboard
https://www.chromestatus.com/feature/5658594150187008
https://bugs.chromium.org/p/chromium/issues/detail?id=749059


# Requesting approval to remove too?
Kinda! I'd like to add a deprecation warning targeting M70 (since we're past feature-freeze for M67, giving folks a few more weeks to adjust seems reasonable). By M70, I expect we'll have had a robust discussion about a deprecation timeline, and a starting point as discussed above.

Thanks!

-mike

Adam Rice

unread,
Apr 6, 2018, 10:20:16 AM4/6/18
to Mike West, blink-dev
Something that might be interesting is a modification to the redirect loop logic: if we find ourselves in redirect loop and one of the sites in the loop is one we've partially deleted cookies for, we could delete the rest of the cookies and see if that breaks the loop. Perhaps it would be better to ask for user permission first.

I like the idea of having "branch date - N days" as the cut-off, rather than "now - N days". It would make the clustering of breakages around release dates even more pronounced, hopefully increasing the chances for developers to figure out why their users were complaining that their site was broken.

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To view this discussion on the web visit https://groups.google.com/a/chromium.org/d/msgid/blink-dev/CAKXHy%3DcxMFdZGgNRvy2je8GiSLFOV2ROax6%3DX0RiUsH2VYSNgQ%40mail.gmail.com.

Domenic Denicola

unread,
Apr 6, 2018, 11:17:26 AM4/6/18
to Mike West, blink-dev

This is very exciting! Any thoughts on extending this to other storage mechanisms, such as localStorage or IndexedDB? It seems like a good end state that in the end non-secure pages can only store state (whether in cookies or not) for the duration of a session.

--

You received this message because you are subscribed to the Google Groups "blink-dev" group.

To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.

Mike West

unread,
Apr 6, 2018, 11:46:15 AM4/6/18
to Domenic Denicola, Adam Rice, blink-dev
Thanks for your comments, Adam and Domenic!

On Fri, Apr 6, 2018 at 4:20 PM Adam Rice <ri...@chromium.org> wrote:
Something that might be interesting is a modification to the redirect loop logic: if we find ourselves in redirect loop and one of the sites in the loop is one we've partially deleted cookies for, we could delete the rest of the cookies and see if that breaks the loop. Perhaps it would be better to ask for user permission first.

This sounds like something that would indeed be useful. It would probably be useful in the status quo, to be honest, as this happens to me sometimes today.
 
I like the idea of having "branch date - N days" as the cut-off, rather than "now - N days". It would make the clustering of breakages around release dates even more pronounced, hopefully increasing the chances for developers to figure out why their users were complaining that their site was broken.

I don't think I understand your suggestion. The current proposal looks at the delta between a cookie's creation date and today: if the cookie was created on April 1st, 2017, and I try to use it nonsecurely today, it's deleted because it's more than a year old. Is your suggestion that we'd stop looking at the age of the cookie, and instead delete any cookie older than March 20th, 2017 (when M65 was released?). I guess that might be reasonable. I'm not sure if it's easier or harder for developers to debug, but it might be simpler to message in a console error?

Thanks for the suggestion!

On Fri, Apr 6, 2018 at 5:13 PM Domenic Denicola <d...@domenic.me> wrote:

This is very exciting! Any thoughts on extending this to other storage mechanisms, such as localStorage or IndexedDB? It seems like a good end state that in the end non-secure pages can only store state (whether in cookies or not) for the duration of a session.


I do have thoughts! Two of them:

1.  State seems to me to fairly clearly fall into the "powerful" bucket of features.
2.  Cookies are the only state that's directly available to a passive network attacker, and we have concrete evidence that that's actively detrimental to user privacy.

So, I agree with the thrust of your comments, but I'm focused on cookies right now. Still, if someone was interested in setting us up for eventual deprecation, adding timestamps to things to support slowly-rolled-out deprecations might be a reasonable thing to do. I'd LGTM patches. :)
-mike

sean.w...@googlemail.com

unread,
Apr 6, 2018, 11:56:19 AM4/6/18
to blink-dev
"Cookies sent over plaintext HTTP are visible to anyone on the network." I would also add that they can be manipulated as well. This makes things such as session fixation a possibility.

Daniel Bratell

unread,
Apr 6, 2018, 12:06:47 PM4/6/18
to blink-dev, sean.w...@googlemail.com
Could a malicious party take advantage of this to delete a user's cookies by having http:// resources pointing to a third party? Or are cookies nowadays always marked secure and would not be affected?

/Daniel
--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.
To view this discussion on the web visit https://groups.google.com/a/chromium.org/d/msgid/blink-dev/847422ac-7dd2-48c7-8beb-30d9751a1884%40chromium.org.



--
/* Opera Software, Linköping, Sweden: CEST (UTC+2) */

Mike West

unread,
Apr 6, 2018, 12:13:43 PM4/6/18
to Daniel Bratell, blink-dev, sean.w...@googlemail.com
Hey, Daniel!

On Fri, Apr 6, 2018 at 6:06 PM Daniel Bratell <bra...@opera.com> wrote:
Could a malicious party take advantage of this to delete a user's cookies by having http:// resources pointing to a third party? Or are cookies nowadays always marked secure and would not be affected?

Yes, this is a risk.

Only something like ~7% of cookies are marked as `Secure` (meaning that they can't be read or written to from non-secure connections). Some larger percentage of cookies are covered with strong HSTS configurations that prevent anyone from loading an origin to which a given cookie might be sent over HTTP, malicious or not. It's certainly possible that sites which are still reachable over HTTP could be affected by this intent. Of course, it's also true that those cookies would be available to network attackers, which is exactly what this intent aims to mitigate.

At the end of the day, developers have clear options: they can adding the `Secure` attribute to cookies they wish to protect, and/or they can configure a strong HSTS policy to protect their sites more generally. I'd be quite happy if we could encourage either to be adopted more widely.

-mike

sean.w...@googlemail.com

unread,
Apr 6, 2018, 12:38:28 PM4/6/18
to blink-dev, sean.w...@googlemail.com
I don't know if I quite follow. You can wipe the cookie by modifying an HTTP response to set the cookie to expire at past date. The secure flag on cookies indicates to the browser that the cookie should only ever be transmitted over HTTPS. I think that you could perhaps overwrite this is the traffic is served over plain HTTP (overwrite the cookie without the Secure flag), but not entirely sure how this is handled by the browsers. Would make for an interesting attack vector though.

The point of HTTPS is both confidentiality as well as we integrity.

Yoav Weiss

unread,
Apr 6, 2018, 12:55:14 PM4/6/18
to Mike West, Daniel Bratell, blink-dev, sean.w...@googlemail.com

Could we mitigate that risk to non-suspecting (but non-HSTS) secure origins by marking those cookies as `secure` instead of deleting them? (as you pointed out in your GH explainer)

I suspect that if we want to encourage the adoption of `secure` or HSTS, it'd have to be more explicit (e.g. perform the same to cookies that don't satisfy either, which is another option you pointed out in your explainer). Seems orthogonal to the risk that Daniel pointed out.
 
 
-mike

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.

David Benjamin

unread,
Apr 6, 2018, 1:07:29 PM4/6/18
to sean.w...@googlemail.com, blink-dev
I'm also not following this attack. What exactly is the scenario? I'm having a hard time picturing anything that this new more aggressive timeout would enable that isn't already enabled by virtue of plain HTTP being open to the network in every way.

Yoav Weiss

unread,
Apr 7, 2018, 2:40:44 AM4/7/18
to David Benjamin, sean.w...@googlemail.com, blink-dev
Let's say content.com is enabled over HTTPS, redirected to HTTPS whenever a user hits its HTTP end points, and believes they're in good shape.
However, content.com hasn't turned on HSTS, and they serve their cookies without marking them as `secure`.

Deleting any old cookies that are served over HTTP would mean that malicious.com can include HTTP subresource requests to content.com, which will result in content.com's old cookies being deleted.

Marking old cookies as implicitly `secure` instead (which Mike suggested as an option in his explainer) would mean that HTTPS-based content.com is not affected when malicious.com links to its HTTP based subresources, while still having the same desired effect of limiting cookies over HTTP.

To be perfectly clear, I'm highly supportive of this proposal. I just think that the scenario that Daniel outlined is problematic, and we should avoid it if we can.

David Benjamin

unread,
Apr 7, 2018, 3:09:39 PM4/7/18
to Yoav Weiss, sean.w...@googlemail.com, blink-dev
I see. In that scenario, content.com's cookies are already easily deletable today, without this change. An attacker can already simply inject expires value to erase them all. Or read the value, hence the Secure attribute. Or inject any other cookie value, hence HSTS and the __Secure- prefix.

But I suppose the point is that one would even need to control the network to do this with this change, which is true. I would note that an HTTPS site's threat model presumably includes the network being hostile, so this is really just lowering the barrier to one facet of an existing problem.

Adam Rice

unread,
Apr 8, 2018, 11:52:07 PM4/8/18
to Mike West, Domenic Denicola, blink-dev
I don't think I understand your suggestion. The current proposal looks at the delta between a cookie's creation date and today: if the cookie was created on April 1st, 2017, and I try to use it nonsecurely today, it's deleted because it's more than a year old. Is your suggestion that we'd stop looking at the age of the cookie, and instead delete any cookie older than March 20th, 2017 (when M65 was released?). I guess that might be reasonable. I'm not sure if it's easier or harder for developers to debug, but it might be simpler to message in a console error?

Sorry, I wasn't very clear. I did indeed mean expire based on the date of the cookie. I suggested using the branch date rather than the release date because release dates are harder to pin down. I guess the counter argument is that having a bunch of cookies that are almost exactly a year old all vanish at once is easier to understand than when cookies that are 58 weeks old vanish.

Mike West

unread,
Apr 9, 2018, 3:23:28 AM4/9/18
to Yoav Weiss, Adam Rice, Daniel Bratell, blink-dev, Sean Wright, David Benjamin
On Fri, Apr 6, 2018 at 6:55 PM Yoav Weiss <yo...@yoav.ws> wrote:
On Fri, Apr 6, 2018 at 6:13 PM Mike West <mk...@chromium.org> wrote:
Hey, Daniel!

On Fri, Apr 6, 2018 at 6:06 PM Daniel Bratell <bra...@opera.com> wrote:
Could a malicious party take advantage of this to delete a user's cookies by having http:// resources pointing to a third party? Or are cookies nowadays always marked secure and would not be affected?

Yes, this is a risk.

Only something like ~7% of cookies are marked as `Secure` (meaning that they can't be read or written to from non-secure connections). Some larger percentage of cookies are covered with strong HSTS configurations that prevent anyone from loading an origin to which a given cookie might be sent over HTTP, malicious or not. It's certainly possible that sites which are still reachable over HTTP could be affected by this intent. Of course, it's also true that those cookies would be available to network attackers, which is exactly what this intent aims to mitigate.

At the end of the day, developers have clear options: they can adding the `Secure` attribute to cookies they wish to protect, and/or they can configure a strong HSTS policy to protect their sites more generally. I'd be quite happy if we could encourage either to be adopted more widely.

Could we mitigate that risk to non-suspecting (but non-HSTS) secure origins by marking those cookies as `secure` instead of deleting them? (as you pointed out in your GH explainer)

We could. I'm a bit concerned that this approach would end up locking sites that haven't yet migrated to HTTPS out entirely (as we don't allow sites to overwrite `Secure` cookies over non-secure transport. I'm not terribly enthusiastic about building a new variant of `Secure` that had different properties... Deletion seems to me to be a simpler approach, and has clearly visible effects: my intuition is that it's going to be easier for developers to deal with, but I'm quite interested in developer feedback on this point.
 
I suspect that if we want to encourage the adoption of `secure` or HSTS, it'd have to be more explicit (e.g. perform the same to cookies that don't satisfy either, which is another option you pointed out in your explainer). Seems orthogonal to the risk that Daniel pointed out.

I would _love_ to see more folks using `__Secure-` (or `__Host-`) prefixes, and marking their cookies as `Secure`, and using HSTS. The way I look at this is that each of these is a concrete mechanism which developers can use to ensure that their cookies aren't susceptible to manipulation. I think it's pretty reasonable for us to talk about them in that context, as hardening tools above and beyond what the browser is going to be able to do by default.

But at the end of the day, if a site is offering content over HTTP, and isn't ensuring that users' data is encrypted, then they're going to have a bad time. If we see widespread abuse along the lines of the scenario Daniel presents, then it might be worth determining how we can loosen things up a bit, but I'm not actually sure that's a good idea: sites shouldn't trust the network, and I'd not like to encourage them to do so.

On Mon, Apr 9, 2018 at 5:52 AM Adam Rice <ri...@chromium.org> wrote:
I don't think I understand your suggestion. The current proposal looks at the delta between a cookie's creation date and today: if the cookie was created on April 1st, 2017, and I try to use it nonsecurely today, it's deleted because it's more than a year old. Is your suggestion that we'd stop looking at the age of the cookie, and instead delete any cookie older than March 20th, 2017 (when M65 was released?). I guess that might be reasonable. I'm not sure if it's easier or harder for developers to debug, but it might be simpler to message in a console error?

Sorry, I wasn't very clear. I did indeed mean expire based on the date of the cookie. I suggested using the branch date rather than the release date because release dates are harder to pin down. I guess the counter argument is that having a bunch of cookies that are almost exactly a year old all vanish at once is easier to understand than when cookies that are 58 weeks old vanish.

I'm still not following the proposal. Sorry! Can you make it a little more concrete? For example, M66 branched on March 1st. 2018, How would we use that date to determine whether or not a cookie would be allowed through or not? Do we say "M66 does not support cookies with a creation date prior to March 1st, 2017"? I think that might be interesting, actually, as it would give us a pretty clear way of communicating a schedule to developers.

Thanks!

-mike
 

Adam Rice

unread,
Apr 9, 2018, 4:23:23 AM4/9/18
to Mike West, Yoav Weiss, Daniel Bratell, blink-dev, Sean Wright, David Benjamin
I'm still not following the proposal. Sorry! Can you make it a little more concrete? For example, M66 branched on March 1st. 2018, How would we use that date to determine whether or not a cookie would be allowed through or not? Do we say "M66 does not support cookies with a creation date prior to March 1st, 2017"? I think that might be interesting, actually, as it would give us a pretty clear way of communicating a schedule to developers.

The implementation would look something like

if (!url. SchemeIsCryptographic() && 
  cookie.CreationDate() < base::Time::FromTimeT(BRANCH_POINT_AS_TIME_T - 60 * 60 * 24 * 365)) {
  store->DeleteCanonicalCookie(cookie);
  // TODO(ricea): Mark the host as having had a cookie trimmed?
  continue;
}

When M66 releases, the owner of http://somesite.example/ gets a wave of reports of "Operation Failed" errors from users. Their web developer quickly notices that all the people with the problem are running Chrome 66, does a search for "Chrome 66 broke my site", and efficiently finds information on productforums.google.com or developers.google.com.

The point of using this comparison rather than simply CreationDate() < base::Time::Now() - base::TimeDelta::FromDays(365) is to make the cluster of user complaints correlated as clearly as possible with the release of the new version, so it doesn't get smeared by people whose cookie was created around a year ago. It also ensures that there are new spikes in complaints with each stable release, so people who didn't find the cause the first time get more chances to identify the problem.

Daniel Bratell

unread,
Apr 9, 2018, 5:02:48 AM4/9/18
to Mike West, Adam Rice, Yoav Weiss, blink-dev, Sean Wright, David Benjamin
Thanks for the answers (and the clarifications of my badly forumulate question)!

So there is a risk that some malicious site could trigger deletion of third party cookies, but unless they have write-access to the network that is all they can do. And if they have write-access to the network they could already do much worse. Reasonably this could force that third party site to refresh cookies once a year, or force the user to reconfigure their site settings once a year.

A site that is fully https can prevent this from happening by marking the cookies as Secure. A site that uses http will have their cookies deleted anyway once a year under this proposal.

Could a user avoid the attack by disabling third party cookies? If they are not sent, they would not be deleted, right?

Considering that the impact is limited in most cases (I will assume little in cookies can't be recreated), that the attack would have little purpose beyond being evil, and that it is hard to do on a massive scale I don't think it is a show-stopper, though it is unfortunate that there seems to be no good way to avoid it.

/Daniel
--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.

Ojan Vafai

unread,
Apr 9, 2018, 12:01:41 PM4/9/18
to Daniel Bratell, Mike West, Adam Rice, Yoav Weiss, blink-dev, Sean Wright, David Benjamin
Lgtm1

This seems consistent with our policy of limiting powerful features on insecure pages and extremely unlikely to break anything iser visible. Many users manually clear cookies regularly, so sites already have to be resilient to them being cleared. 

Yoav Weiss

unread,
Apr 9, 2018, 2:41:34 PM4/9/18
to Ojan Vafai, Daniel Bratell, Mike West, Adam Rice, blink-dev, Sean Wright, David Benjamin
LGTM2

I wish there was a simple way to avoid the cookie deletion scenario, but:
1) Developers can protect themselves from that scenario (by either HSTS or secure cookies)
2) If we'll see this happening a lot, we can think of potential mitigations

Harald Alvestrand

unread,
Apr 10, 2018, 12:05:09 PM4/10/18
to Yoav Weiss, Ojan Vafai, Daniel Bratell, Mike West, Adam Rice, blink-dev, Sean Wright, David Benjamin
I expect the most common cookie that is deleted by this to be the cookie that says the user has permitted cookies.

Chris Harrelson

unread,
Apr 11, 2018, 3:31:49 PM4/11/18
to Harald Alvestrand, Yoav Weiss, Ojan Vafai, Daniel Bratell, Mike West, Adam Rice, blink-dev, sean.w...@googlemail.com, David Benjamin
This is an intent-to-deprecate so it only requires one LGTM, however I am also ok with an intent to deprecate for M70. The actual plan for removing will need a new discussion, as mentioned in the first email.

Thiemo Nagel

unread,
Jun 4, 2018, 8:01:20 PM6/4/18
to blink-dev, h...@google.com, yo...@yoav.ws, oj...@chromium.org, bra...@opera.com, mk...@chromium.org, ri...@chromium.org, sean.w...@googlemail.com, davi...@chromium.org, chri...@chromium.org
We've missed M68 branch and are pushing this down by 1 milestone.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+unsubscribe@chromium.org.



--
/* Opera Software, Linköping, Sweden: CEST (UTC+2) */

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+unsubscribe@chromium.org.

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+unsubscribe@chromium.org.

Thiemo Nagel

unread,
Jul 19, 2018, 5:15:59 AM7/19/18
to Thiemo Nagel, blin...@chromium.org, h...@google.com, Yoav Weiss, oj...@chromium.org, bra...@opera.com, mk...@chromium.org, ri...@chromium.org, sean.w...@googlemail.com, davi...@chromium.org, chri...@chromium.org
Pushing down another milestone. The deprecation notice in dev console is now targeting M-70.


To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.



--
/* Opera Software, Linköping, Sweden: CEST (UTC+2) */

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to blink-dev+...@chromium.org.

--
You received this message because you are subscribed to the Google Groups "blink-dev" group.
Reply all
Reply to author
Forward
0 new messages