As mentioned in my last entry, Livejournal have changed their url
scheme to get around a problem in mozilla. The trouble is down to the
-moz-binding CSS property. I'll repost a copy of the
short lived posting to the lj_dev community earlier.
Discussing the URL Change
As we recently announced in [info]news, we have changed the canonical
URL of most journal, community, and syndicated content. While we did
offer subdomains to Paid users in the past, this is now the canonical
URL that we will link and redirect to for all journals. However, all
communities are located at http://community.livejournal.com/username and
syndicated accounts at http://syndicated.livejournal.com/username. Due
to the way certain proxy servers are configured, and the fact that the
HTTP RFC prohibits it, the canonical URL for journals with a username
starting with an underscore will be
http://users.livejournal.com/username. We are however offering a free
rename if you fall into this group.
So now the technical side of all of this and why it was a required
change; bear with me as its 3am my time and I'm sitting in John F.
Kennedy Airport after a five hour flight. Late last week we become aware
that it was possible to use the "-moz-binding" CSS attribute within
Mozilla and Mozilla Firefox to execute arbitrary offsite JavaScript. As
this attribute is designed to allow attaching an XBL transform and
JavaScript to any node within the DOM, it is quite easy to use in a
malicious fashion. We immediately altered our cleaner to strip this
attribute from entries and comments, though also realized that wasn't
even half the battle.
As we allow custom CSS in many of our styles, as well as the ability to
link to an external stylesheet in a variety of fashions, it was quite
possible to take advantage of this exploit and hijack the session cookie
of any user who views your journal. As we, along with many other sites,
used one cookie to authenticate a user, this cookie was quite powerful
if stolen. If the user had not chosen to bind their cookie to their IP
address, a malicious user could steal it, login as that user, deface the
account and SPAM with it, as well as modify that user's style to include
the exploit thus causing this problem to spread much like a virus.
Borrowing the idea from another development team within Six Apart, we
decided we needed to break our cookies into three categories. One cookie
would be our application management cookie, this cookie would only be
accessible on www.livejournal.com where we will not display untrusted
content. A second cookie will be accessible on all subdomains of
livejournal.com, though it only will say if you are logged in or not; it
is solely for optimization. We then will issue one cookie for each
journal you visit. This cookie will be only accessible on
username.livejournal.com or community.livejournal.com/username as it is
limited to a single journal. This cookie will only grant you the
permission to read protected entries and post in the particular journal.
This means that if the journal owner steals your cookie, they will be
able to do nothing more than view their journal and comment upon it as
if they are you. In the end you will have n+2 cookies, with n being the
number of journals you visit.
Due to the fact that we cannot clean every external CSS stylesheet
linked to every time we generate a journal page, this change is
required. While it does not fully protect us from some new cross site
scripting vulnerability that can be exploited via entries or comments,
they are much easier to block, patch, and recover from quickly. With
Mozilla deciding to allow the execution of arbitrary JavaScript via CSS,
there is no other viable solution than the one we have undertaken. We
developed a plan to phase all of this in over the next week, URL change
first and then followed by the cookie change, though this morning we
were made aware that this was being actively exploited. As such we took
our week time line and shortened it to about twelve hours. While URLs
have been changed at this time, our cookie handling change has not yet
happened. This should however be expected to take place within the next
day or two as well as various other cleanups and fixing bugs we've
already encountered.
Please feel free to let us know if you have any questions and open a
support request if you find a bug or encounter a problem. Sorry all of
this came with just about zero warning, but in the end we could not wait
longer to fix this problem.