Bruce Schneier | |||||||||||||||
Schneier on SecurityA blog covering security and security technology. « Employee Theft at Australian Mint | Main | Congress Learns How Little Privacy We Have » June 27, 2006Ignoring the "Great Firewall of China"Richard Clayton is presenting a paper (blog post here) that discusses how to defeat China's national firewall: ...the keyword detection is not actually being done in large routers on the borders of the Chinese networks, but in nearby subsidiary machines. When these machines detect the keyword, they do not actually prevent the packet containing the keyword from passing through the main router (this would be horribly complicated to achieve and still allow the router to run at the necessary speed). Instead, these subsiduary machines generate a series of TCP reset packets, which are sent to each end of the connection. When the resets arrive, the end-points assume they are genuine requests from the other end to close the connection -- and obey. Hence the censorship occurs. Posted on June 27, 2006 at 1:13 PM • 90 Comments To receive these entries once a month by e-mail, sign up for the Crypto-Gram Newsletter. Clever. "Instead try to realize the truth." "What truth?" "There is no wall." Posted by: Pat Cahalan at June 27, 2006 1:45 PM ok. is there any way the censors can tweak the hop count in their reset packets to make them appear as if they had originated at the far end of the channel? Posted by: another_bruce at June 27, 2006 1:58 PM Possibly, but would it be efficient? I kind of think that computing hop counts can be quite costly when dealing with lot of traffic. Posted by: Tim Vail at June 27, 2006 2:02 PM It's certainly feasible to inject the reset packets with a correct-looking hop count; if you're sniffing the TCP packets going both directions then you already have all the information you need. (i.e, you just need to set the IP TTL field to the same value as in the packets you observed.) Posted by: Mark Gritter at June 27, 2006 2:28 PM @Mark Well, looking for keywords does not really require any "state" information, or any connection tracking. Tracking the ttl fields of packets that you observed requires a bit more state information. And for routers processing lot of traffic, that can be an overhead. That is what I'm thinking...unless someone can figure out a way to do it that is more stateless. Posted by: Tim Vail at June 27, 2006 2:45 PM So how does the connection terminate when the RST packets are thrown away? With the FIN flag?? and if so doesn't that mean that the snipering routers just have to send 2 packets; one with a FIN and another with the RST packet? Jurgen Posted by: Jurgen at June 27, 2006 3:21 PM You know, they can do a LOT better: Inject a route for a /32 going to the questioned host. Now route the packets manually through your IDS fully, and start dropping/modifying traffic. After a little while, revoke the injected route. Posted by: Nicholas Weaver at June 27, 2006 3:21 PM Actually, route updates would probably be too slow. But its interesting that they are using the same basic trick Bro uses. Posted by: Nicholas weaver at June 27, 2006 3:29 PM This is a very interesting discovery, but I think there is still a limitation to its practicality. "these subsiduary machines generate a series of TCP reset packets, which are sent to each end of the connection" Even if the client-side installs a packet filter, websites would still be unaccessible, unless the web server also ignored the injected RSTs. Posted by: casey at June 27, 2006 3:32 PM More importantly, it requires a presence on BOTH sides of the endpoints (the RSTs undoubtedly are sent in both directions). As such, if you control BOTH endpoints, you can do a much more subtle job of firewall evasion. Posted by: Nicholas weaver at June 27, 2006 3:38 PM Not only would route updates possibly be too slow, but can you imagine the size of the routing table if you're blocking /32s? No idea how many blocks they perform a day, but the internet-connected population is only growing. Posted by: Martin Espinoza at June 27, 2006 3:48 PM so when do we ALL start to configure web servers to ignore resets from china? Posted by: Anonymous at June 27, 2006 3:54 PM An interesting followup. The authors hypothesize that the system is stateless, but without proving it. Someone should do the followup test of fragmenting the request across multiple TCP packets or IP fragments, and see if it triggers the firewall. If so, you can then evade for arbitrary sending of requests with software only on the sending side. Posted by: Nicholas Weaver at June 27, 2006 3:56 PM And you don't want to ignore RSTs. They are critical and important. Posted by: Nicholas weaver at June 27, 2006 3:57 PM Let's not forget that the Chinese governement has access to the logs of these sessions. If you're consistantly triggering their censors, you might just get a visit from the authorities. An interesting discovery, but a long way to go before truly free speech. Posted by: Jonathan Louie at June 27, 2006 4:02 PM That ignores the obvious - if standard OSs included methods to defeat the censorship, the government would just choose a different method to censor. Posted by: Chris at June 27, 2006 4:13 PM Yes, but you have to keep in mind that nothing ever ends the constant back-and-forth between attacker and defender, which is what this really is. Saying "oh, but they could come up with another way," isn't the point. The point is that, in the realm of attack trees, you've just increased the cost of China's attack on your connectivity. They can do more to counteract what you're doing, but it means more work for them. Posted by: Rogue Shoten at June 27, 2006 4:17 PM Sorry, but how are they going to filter keywords in tcp packets that are being send through an ssl connection, on which a user can surf, or simply trough a 1,95$ shell, by using a remote webserver like say in the U.S.? Bypassing this firewall system isn't that complicated as decribed in the paper, at least trivial to do it like that. Posted by: Jungsonn at June 27, 2006 4:30 PM I am wondering if this will work against products like Websense as well. I know that, with Websense connected to a PIX firewall, the original outbound packet from the web client still gets passed by the firewall and the return packet is allowed. It's just that since the Websense enforcement point is in your local network, it can send you the blocked html page before the return comes back from the outside world. If you block traffic from the Websense enforcement point that sends out the "this page is blocked" html, can you still surf wherever you want? Might have to experiment with this a little. It probably wouldn't work with a proxy server if Websense is running on the proxy, but if not, it might. Posted by: Greyfeld at June 27, 2006 4:38 PM Jungsonn summed up what I was about to say. If you have to control both ends than this isn't necessary since you can simply use encryption. I was thinking people outside China could provide proxies that either drop RST's or use encryption. Posted by: oztun at June 27, 2006 4:40 PM I was in China about 4-5 years ago. At the time you couldn't get to sites like cnn.com. I found an anonymous proxy 'https' and had no problem bringing up any site I wanted. I realize this only covers web server access but it was a breeze to get around their firewalls and anyone who wanted to was able to do it in less than 5 minutes. Posted by: Steve at June 27, 2006 4:49 PM So Falun-Gong.com and Free-Tibet.org need to ignore RST packets from China - they're not likely to mind. On other other hand, getting non-China-specific sites to ignore them is tougher. SSL doesn't protect you from everything - if you're looking at https://censored.example.com/censored.stuff, Posted by: Bill Stewart at June 27, 2006 4:50 PM I think reset messages may be sent by American ISPs as well, to terminate some p2p file sharing connections. Posted by: rather be anonymous :( at June 27, 2006 4:55 PM I think it would be trivial, for the router sniffing the traffic/injecting the RST packets, to detect that the RST packets have been ignored and that the TCP session has actually not been stopped, just by looking at the TCP sequence number. In other word, I tend to think that yes, you can bypass the firewall, but you can expect a visit from the authorities soon after! Romain. Posted by: Romain Wartel at June 27, 2006 4:57 PM I'm suprised this actually works. I would consider this to be a bug that can be exploited at least into a DOS if not higher. The OS should protect against it (similar to packet injection). Of course, if I misunderstand how RST is supposed to be handled, please ignore the above ;). Posted by: phessler at June 27, 2006 5:25 PM @Jungson If you fake the http header saying you want to pull up the page "censored.html", you don't get the page you were trying to view. Its like giving someone a map and then "faking" the address they're trying to go to -- they'll end up at the wrong place. Posted by: Nathan at June 27, 2006 5:27 PM Question: Reason: They are not closing "their" connection they are affecting your hardware. Example: It would be legal for them to close the connection on their equipment, but they do not want to do that because you would just open another connection. Instead they close the connection at YOUR hardware... sounds illegal to me. Posted by: AG at June 27, 2006 5:27 PM "SSL doesn't protect you from everything - if you're looking at https://censored.example.com/censored.stuff, Incorrect. Secure Socket Layer establishes an encrypted session with the remote system first, then requests resources. This essential because what data is requested is almost always as sensitive as the data itself. (By the way, this is the reason that web servers cannot offer SSL-enabled named virtual hosts from the same address. Connections are initiated before the HTTP request goes through.) Posted by: [Si]dragon at June 27, 2006 5:32 PM So your telling me that I could forge packets for any address that I wanted and send resets to say cnn.com and the person that I am pretending to be would henceforth stop being able to access cnn? That sounds like a dos waiting to happen. Posted by: neo at June 27, 2006 5:39 PM [Si]dragon is correct - this is exactly why you can't put multiple SSL certificates on the same vhost. The initial request is at the IP address, then, after encryption starts, you send your host-specific request. Of course, they could just censor based on IP address ... Posted by: D at June 27, 2006 5:49 PM @nathan, enlighten me... It was the indication that it could be done through ssl (tunneling), though i prefer shellaccess on a foreign server, Both cases beats the system, and do it without being to scientific about it. people can learn using these systems (ssl, shells), but to put their tcp packet theory of the presented paper in practise requires a different kind of people and skills The people's republic, yeah now we know ;-) Posted by: Jungsonn at June 27, 2006 5:52 PM I note the comments about lack of "state". It is true (I'm one of the authors of the paper) that we've not proved its absence [that's hard really], but all the evidence points that way. However, I'd caution against assuming that testing with fragmented packets would prove it one way or the other -- since the devices being used (which come from an IDS environment) are specifically designed to handle these cases. Bottom line is that a firewall system with "state" would do a much more sophisticated job at blocking! and, for example, could easily get TTL values correct. We accept that encryption also evades keyword blocking. However, it is also blockable in itself (by assessing the entropy of the packets passing the firewall) so it's not a panacea. We also comment (see the paper) that it could make a difference to the authorities approach to your case -- since the firewall can log everything -- to ensure that they can see what you're really doing. This may make you less (or maybe more) of a target. There's more than one round to this "game"! What would make a difference is for vendors to change their TCP/IP stacks so that "out of the box" the firewall's "attacks" fail to work. If the code is "standard" it is hard for the authorities to "make an example" of people who are evading the firewall. Posted by: Richard Clayton at June 27, 2006 5:57 PM Re: [Si]dragon Actually, an attacker _can_ know what site you're looking at (though not what document within the site) for precisely this reason. As you said, before the HTTP headers are sent, the SSL connection is negotiated... which includes the server sending the (unencrypted) certificate which identifies it as censored.example.com, for example. Posted by: Kile at June 27, 2006 5:59 PM A different question: are there things that we can do with ordinary, not-censored-by-China, internet connections that would make their censorship more expensive for them? For instance, if we were always to send chopped up and out-of-order packets to China, would that hinder their filters? Seems like it would. Posted by: dr2chase at June 27, 2006 6:22 PM Kile said, "Actually, an attacker _can_ know what site you're looking at (though not what document within the site) for precisely this reason. As you said, before the HTTP headers are sent, the SSL connection is negotiated... which includes the server sending the (unencrypted) certificate which identifies it as censored.example.com, for example." But _that_ part can be safely "wrong." The receiving browser would throw a warning (The cert says you are visiting blahblah.com, but you typed in foobar.com. Do you want to continue?) but the traffic would still be encrypted just fine. The only thing the firewall would "know" are the endpoint addresses and ports. Posted by: Scott Frazer at June 27, 2006 7:47 PM I am living in China, and yes, they block by IP. So https does not help. The Great Firewall is vast and extremely annoying. I have taken to using tor+privoxy when I want to read someting from Wikipedia or Blogspot. It works but it is really slow. Posted by: adevadeh at June 27, 2006 9:36 PM I am living in China, and yes, they block by IP. So https does not help. The Great Firewall is vast and extremely annoying. I have taken to using tor+privoxy when I want to read someting from Wikipedia or Blogspot. It works but it is really slow. Posted by: adevadeh at June 27, 2006 9:36 PM I find it odd that no one has mentioned the one thing that I'd worry about using this technique for real in China: yes, the blocking sounds like the way Websense works. I wonder if it logs like Websense does? Sure, you may find what you're looking for outside the firewall --- and then the people who set up the firewall come to find you.... Posted by: badger44 at June 27, 2006 10:14 PM No it doesn't work, at least for SMTP, POP3, IMAP4 and HTTP. See my earlier blog post: Problem is, original packets are *not* passed through the GFW unfiltered. Posted by: spacehunt at June 27, 2006 10:46 PM Hello, Am I missing something? How about VPNs? The chinese government would know that you have this (encrypted) traffic with this other host. No more. For more info: http://openvpn.net/ The only problem is that it does take a bit of skill to install/use. How long before it's easy enough so that the firewall dissolves? Merc. Posted by: Tony Mobily at June 27, 2006 10:50 PM Hello, Am I missing something? How about VPNs? The chinese government would know that you have this (encrypted) traffic with this other host. No more. For more info: http://openvpn.net/ The only problem is that it does take a bit of skill to install/use. How long before it's easy enough so that the firewall dissolves? Merc. Posted by: Tony Mobily at June 27, 2006 10:50 PM Actually private VPNs are illegal in China; you have to register your VPNs, together with decryption keys, with the government. Posted by: spacehunt at June 27, 2006 10:59 PM > Actually private VPNs are illegal in China; Actually, that's Great Britain. China is otherwise. Yes, it has always been trivial to bypass the GFW, Posted by: Aminorex at June 28, 2006 12:17 AM >> Actually private VPNs are illegal in China; > Actually, that's Great Britain. China is otherwise. Actually, that's nonsense. We don't need to register VPNs and we don't need to hand over encryption keys in the UK. Posted by: Gordonjcp at June 28, 2006 1:39 AM I point out that IPSEC (the basis of VPNs) is specifically designed to handle attacks involving injection of spurious packets and/or corruption or replay of legitimate ones. Sounds like a perfect application to me. Posted by: Phil Karn at June 28, 2006 3:12 AM Wouldn't it be easier to not trigger the filter at all ? For example, fragment the packets in the middle of sensitive data (fragment 1 ends with "demo", fragment 2 starts with "cracy"). Web servers would just need to do the same on the way back. I don't think China can actually keep connection sequence for every open connection and check whether successive fragments match the filter. Posted by: Jesrad at June 28, 2006 4:24 AM Additionnally, the criterion of the filter can be determined easily by anyone who knows a reliable, accessible host on the other side of the GFW. In fact the criterion list could be updated in real time by the bypassing software whenever it detects that a connection received bogus RST packets. Posted by: Jesrad at June 28, 2006 4:45 AM @neo: You need to know their TCP sequence numbers -- easy if you have a sniffer on their local network or route, hard otherwise. Even better, you could reset the client and then spoof it to the server; this is called TCP session hijacking. Once upon a time, when such numbers were easier to guess, this was a relatively common attack. This is the reason properly designed modern OSes generate hard-to-guess sequence numbers. Posted by: roger at June 28, 2006 6:51 AM Register VPN decryption keys with the govornment in the UK? I live here, that's bollocks, we are free to privatise as we please... unlike poor China :-( Posted by: Richard at June 28, 2006 6:52 AM @ Richard Clayton > ... encryption also evades ... also blockable in itself (by assessing the entropy of the packets ... Wouldn't that also entail blocking all compressed traffic, also? I can't believe a non-stateful filter will be able to reliably differentiate between them. Also, you must have heard about steganography, right? I'm pretty sure it's possible to artificially lower the entropy back down to whatever you want in a sophisticated enough way that detection would require more processing power than they can economically wield.
Posted by: RonK at June 28, 2006 6:59 AM The "than they can economically wield" part of my last post was probably a bit too optimistic. Especially if (perhaps for other reasons) someone's communications get personal scrutiny. Posted by: RonK at June 28, 2006 7:07 AM The "than they can economically wield" part of my last post was probably a bit too optimistic. Especially if (perhaps for other reasons) someone's communications get personal scrutiny. Posted by: RonK at June 28, 2006 7:10 AM > we don't need to hand over encryption keys in the UK. If the HO gets its way with RIP (cue the current consultation), then we'll have to hand them over at a request. Without a warrant. Posted by: RIP at June 28, 2006 7:21 AM The encryption thing is a great idea, but at least as of 18 months ago, the Chinese government did not allow encrypted packets out of the country. I know this, because I worked as a consultant for a company that was providing e-mail for employees in China and we had to disable the encryption requirements in order to allow them access to the systems. Posted by: Catherine at June 28, 2006 9:40 AM Aloha! One question I have is if sending RSTs to hosts outside China makes it an offence? This really is a DoS-attack (as well as a form of session hijacking.) Blocking the traffic on the border, and messing up the traffic within RPC is one thing. But distrupting traffic - which could mean disrupting services delivered by companies in the rest of the world, can't be ok, no? Posted by: Joachim at June 28, 2006 10:02 AM Is there are need to register decryption keys with the Chinese government for anyone who wants to access information from within? Posted by: Keith at June 28, 2006 10:10 AM Yeah, These basic ideas like SLL and shells and all that just wont work. I was in China 2 months ago, and there was just no way around it, they didnt let any eencrypted traffic out. I couldnt do what I needed because my company uses a Remote Desktop Citrix solution and I couldnt even log in. Posted by: cory at June 28, 2006 11:21 AM I use the following method when I need to use an insecure network which can also be used to bypass a firewall watching my connections. I connect my home computer through ssh and forward a VNC port to my remote desktop from my home computer. The connection is compressed and encrypted. The best of all my connection is always a ssh to my home computer; wherever I connect through VNC can not be monitored by my local network. Posted by: Mr.G. at June 28, 2006 12:29 PM not even China can filter the human spirit. I suspect that international blogging, hackivism, and human ingenuity will continue to erode the effectiveness and relevance of the GFW. elgoog may still be accessible by the Chinese citizens: New elgoog.com at: Posted by: Great firewall of china at June 28, 2006 12:38 PM If encrypted packets are not allowed at all, this will not bypass the firewall in China :( Unencrypted VNC connection might work though, since it is only a compressed bitmap transmission. Posted by: Mr.G. at June 28, 2006 12:40 PM @richard @Gordonjcp @RIP At least we don;t have to worry they don't use this ofter (oh did i mention that its use can be kept secret). Posted by: Lee at June 28, 2006 1:00 PM You can also encapsulate data in etags with base64... just get more people to support embedding such things. Posted by: Chode at June 28, 2006 1:34 PM Oh ... and you can also transfer messages using steganography in html, photos, wav files, etc... Posted by: Chode at June 28, 2006 1:46 PM And let us not forget freenet. 0.7 once more stable should help end the madness. Then; there is also running SSL on port 80. That may have mixed results. Oh and data transfers over ICMP, like icmp-shell. Creating distribution hubs in China would also work. Tunnel the traffic through multiple routes into multiple locations, aggregate it and distribute from within. Piggy-backing traffic from Chinese government officially accepted sites in the rest of the world with a hash payload to act as a proxy... That would be nifty. Maybe random looking user-agent tags being pointers to sites and etags carrying the payload. I know, requires a special client-server model. How about reverse proxy? Is SSH/SSL allowed IN to China? Could route with port knocking or something more simple like a web interface... How about shipping cheap AP's to China or convincing some of them to acquire some AP's and have them set up rogue access points with SSID disabled and route those over backdoor methods. Then the average person could surf unrestricted. The hard work would be done by Chinese techies. I know.... they will flood China with a satelite or high altitude plane to interrupt the AP's... Last ditch effort would be to infiltrate the Film Actors Guild.... nm Posted by: Chode at June 28, 2006 2:02 PM It would not be a good move commercially for the chinese govt to ban or filter VPN's as many many overseas buyers like myself need to be able to connect back to the office when travelling in China. Posted by: Toobs at June 28, 2006 6:39 PM @ adevadeh who said: "I am living in China, and yes, they block by IP. So https does not help. The Great Firewall is vast and extremely annoying. I have taken to using tor+privoxy when I want to read someting from Wikipedia or Blogspot. It works but it is really slow."
So the easiest way is if you open a shell account on a server in the U.S. or some murky east european country, you can surf trough that server. I'm interested in which keywords they "filter" because then some people could make counter measures and replace those words in the httpstream to china, beating that weird system and messing up their filters, and have a piece of software which decodes back the words that are replced to bypass the filter. Seems a good operation freedom 4 all project. Posted by: Jungsonn at June 29, 2006 10:31 AM I have a https site which IP is forced to be changed every hour and its SSL certificate changes every day. If I have a secret domain name, they can never block it. Is this right, every body? Actually, all home computers have dynamic IPs, if every body install a SSL web on his home computer then tell some Chinese the domain name privately, I think there is no way for the Communist to block it. We have a complete system to break the CCP's blockage. Please visit our web site https://breakevialaxis.org/mvnforum/mvnforum/index?lang=en Posted by: Fulan Peng at July 1, 2006 8:36 PM I live in Shanghai, and have no problem with encrypted traffic. OpenVPN, SSH, HTTPS all work fine (with some exceptions). People can do their banking without issues (except CitiBank - god knows why they're singled out!)
Usually you'll know when someone important is coming, because the blocking magically disappears for a week, so the visiting journalists don't have yet another article to write about the 'evil' firewall. At least this reminds me to add this to my firewall rules both ends. iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP Anyone going to make a list of the naughty routers so we can get more selective about this?
Posted by: Lawrence Sheed at July 2, 2006 10:34 AM And .. quote-of-the-day goes to AG "... sounds illegal to me." ROFL! Posted by: Helophone at July 2, 2006 10:34 PM 2nd prize goes to Chode "And let us not forget freenet. 0.7, once more stable..." WEEHEHEHEE! Posted by: Helophone at July 2, 2006 10:46 PM 3rd prize for Toobs, "trade would be somewhat restricted". This is the *history* of China! HAHAHA! OH NO BWEAR RABBIT PWEAE DON FWOW ME IN THE BWYAR PATCH! Posted by: Helophone at July 2, 2006 10:51 PM Sorry I meant "PWEASE" like tweety bird says ... not supposed to be mocking of chinese accent .. Posted by: Helophone at July 2, 2006 10:54 PM This is virtually useless techno-babble to the average web surfer in China. Why can't anyone develop a user-installable, easy to configure application (platform independent would be an added bonus) that will open a hole in the firewall? Posted by: ThirdRpckPhoto at July 3, 2006 12:45 PM http://www.call2biz.com Posted by: call2biz.gxs at July 18, 2006 8:14 PM After reading all this, am I right to assume that China does not block 443, 500 and the likes? Posted by: Theo at November 4, 2006 2:53 AM Hi, i actually live in china and must say i have seldom seen so many stupid remarks. I *am* living here and can tell you that Lawrence sheed seems to be the only one who also does. Posted by: livinsider at December 7, 2006 10:13 PM I've been able to bypass the firewall with http://www.strongvpn.com, ok but my problem is the speed of the connection once I'm past. I've asked and checked with strongvpn and the connection is clean, it's just slow with or without the firewall. I've got the fastest connection you can buy. What are the speed you guys are getting? Posted by: PB at December 16, 2006 12:44 AM PB, I have the same problem. I am in dongguan and using China Telecom VNET that provides the speed of 2M for Chinese sites. Accessing U.S. sites is so slow that it is just ridiculous. Did you have any luck getting the access speed to be any faster. Any tip is very much appreciated. I am so desperate. Posted by: bq at January 18, 2007 6:37 AM Personalvpn from http://www.witopia.net works. it's openvpn-based (SSL) and is pretty fast from shanghai. only $40 annually. Posted by: Johnny Packetseed at February 14, 2007 1:33 AM this is very clever but ive done better with my grannys computer - 7 MB of memory and 1 MB of RAM its shit but better than bruce's !!!!! Posted by: mills at June 26, 2007 5:00 AM dose any one know how to get around the schools internet securety quickly and easly as i am not great on a pc. e-mail me millsy340@hotmail.co.uk Posted by: Dr lee at June 26, 2007 5:03 AM Its happening again this year, sigh. Always seems to tie in with the government conferences. We have had discussion with China Telecom contacts, and they claim that there is nothing wrong. Unofficial discussion however says that this is likely to lift after the conference as we expect. Posted by: Lawrence Sheed at July 16, 2007 9:29 PM This is still happening right now, on a DSL line in Gansu province. Many connections are RESET, including random resets of SSL connections to my private webmail server (so much so that it's unusable). SSH tunneling (to the same server) is working, fwiw. BJ Posted by: BJ at November 17, 2007 11:01 AM I find the hypocrisy of most Westerners in condemning China for censorship quite sickening. They condemn censorship and then turn around and support Copyright law, and accuse people of not paying artists when they try to assert their freedom by saying what they want through the Internet. The U.S. censors pretty much everything, I've never considered it a free country at all. It's just another variant of statism: for the greater good, you can't say what you want. Posted by: Connelly Barnes at June 23, 2008 3:33 PM Post a comment
Powered by Movable Type. Photo at top by Steve Woit.
Schneier.com is a personal website. Opinions expressed are not necessarily those of BT. |
|
Comments