WEBVTT 00:00:00.090 --> 00:00:13.750 33C3 preroll music 00:00:13.750 --> 00:00:16.299 basically textbooks have been written 00:00:16.299 --> 00:00:19.718 about it countless talks have been 00:00:19.718 --> 00:00:22.480 have been Illuminating all of the errors 00:00:22.480 --> 00:00:26.690 of our ways and still all those sucky 00:00:26.690 --> 00:00:30.400 software is out there but 00:00:30.400 --> 00:00:33.130 Fefe over here the hero of our show 00:00:33.130 --> 00:00:36.700 has put out has put all of these best 00:00:36.700 --> 00:00:39.990 practices into you know into his work to 00:00:39.990 --> 00:00:43.480 try to create a secure website he's 00:00:43.480 --> 00:00:46.859 going to show us how it's done so that 00:00:46.859 --> 00:00:52.489 we can all sleep way better at night and 00:00:52.489 --> 00:00:55.189 with that template go back and 00:00:55.189 --> 00:00:57.303 and secure our own software and so with 00:00:57.303 --> 00:00:59.540 that I'm going to hand it right over to 00:00:59.540 --> 00:01:01.930 Fefe give him a round of applause 00:01:01.930 --> 00:01:12.406 Applause 00:01:13.371 --> 00:01:15.153 thank you I have to start 00:01:15.153 --> 00:01:17.580 with an apology because I did submit 00:01:17.580 --> 00:01:19.840 this talk but it was rejected so the 00:01:19.840 --> 00:01:21.880 slides are not at the stage where they 00:01:21.880 --> 00:01:24.320 should be these are our slides for a 00:01:24.320 --> 00:01:26.359 previous version of the talk it contains 00:01:26.359 --> 00:01:28.179 all the material and I tried to update 00:01:28.179 --> 00:01:30.231 it more but that destroyed the flow so 00:01:30.231 --> 00:01:33.334 we we're stuck with it basically the 00:01:33.084 --> 00:01:35.720 difference was the the audience so while 00:01:35.720 --> 00:01:37.580 I expect more developers here the other 00:01:37.580 --> 00:01:39.259 audience was more and hackers and 00:01:39.259 --> 00:01:42.640 business people so I try to get them 00:01:42.640 --> 00:01:45.800 from where they are and the main question 00:01:45.800 --> 00:01:48.382 usually is "are we there yet?" right 00:01:48.382 --> 00:01:50.842 so about me you probably 00:01:50.842 --> 00:01:52.960 seen this before I'm a code auditor by 00:01:52.960 --> 00:01:55.479 trade I have a small company and 00:01:55.229 --> 00:01:57.230 companies show us their code and I show 00:01:57.230 --> 00:02:00.190 them bugs I find in them quite easy 00:02:01.911 --> 00:02:04.000 but before we start I have a small 00:02:04.000 --> 00:02:06.500 celebration to do this actually happened 00:02:06.500 --> 00:02:09.230 just a day before the first time I 00:02:09.230 --> 00:02:11.680 talked about this so Kaspersky 00:02:11.680 --> 00:02:15.440 message they found some malware introduced 00:02:15.440 --> 00:02:16.540 tied to libc 00:02:16.540 --> 00:02:18.340 which I have written so this is 00:02:18.340 --> 00:02:19.270 like a 00:02:19.270 --> 00:02:26.430 Applause 00:02:27.257 --> 00:02:28.999 some of the malware people 00:02:28.999 --> 00:02:31.020 know what's good 00:02:31.020 --> 00:02:33.430 so basically the main question when I 00:02:33.430 --> 00:02:35.769 talk to customers is we spend so much 00:02:35.769 --> 00:02:38.860 money on this why isn't it working 00:02:38.860 --> 00:02:42.399 and the answer is you're doing it wrong 00:02:42.399 --> 00:02:46.420 so I will try to show now what exactly is wrong 00:02:46.420 --> 00:02:49.830 and there's a small preface here people 00:02:49.830 --> 00:02:51.730 usually say there's no time to do this 00:02:51.730 --> 00:02:54.230 right and that's just wrong you have 00:02:54.230 --> 00:02:56.580 exactly as much time per day as other 00:02:56.580 --> 00:02:58.640 people who did great things so you can 00:02:58.640 --> 00:03:01.780 do great things too you just need to do it 00:03:02.620 --> 00:03:05.420 so let's play a little warm-up game 00:03:05.420 --> 00:03:07.050 it's called how it started and how 00:03:07.050 --> 00:03:09.570 it's going so let's have a demo round 00:03:09.570 --> 00:03:11.420 IBM Watson is revolutionizing 00:03:11.420 --> 00:03:14.839 10 Industries and it's going like this 00:03:14.839 --> 00:03:17.219 whatever happened to IBM Watson that's a 00:03:17.219 --> 00:03:19.629 typical pattern in the security industry 00:03:19.629 --> 00:03:23.150 right so here's another one how it started 00:03:23.150 --> 00:03:25.480 revolutionize security with AI 00:03:25.480 --> 00:03:27.261 right we all know where this is going 00:03:27.261 --> 00:03:28.461 Laugther 00:03:28.461 --> 00:03:31.230 right so that's the pattern 00:03:31.230 --> 00:03:33.640 let's play IT security mine sweeper 00:03:33.390 --> 00:03:35.256 right so everybody here probably 00:03:35.256 --> 00:03:37.349 knows who Gartner is they publish 00:03:37.349 --> 00:03:39.379 recommendations and they even have a 00:03:39.379 --> 00:03:41.249 voting section where people can say 00:03:41.249 --> 00:03:43.159 this is the best product in this section 00:03:42.909 --> 00:03:45.248 right so let's look at a few of them and 00:03:45.248 --> 00:03:48.040 see what happened to people who trusted Gartner 00:03:48.040 --> 00:03:51.020 first is a firewall right so how 00:03:51.020 --> 00:03:54.247 it started the number one recommendation 00:03:54.247 --> 00:03:57.175 is for Fortinet and they have a lot of 00:03:57.175 --> 00:03:59.425 marketing gibberish 00:03:59.425 --> 00:04:01.229 Laughter 00:04:01.229 --> 00:04:03.159 and if you look how it's going it's not 00:04:03.159 --> 00:04:05.300 going so good 00:04:05.850 --> 00:04:08.090 so let's extend the pattern a bit 00:04:08.090 --> 00:04:10.420 why what happened to me in this regard 00:04:10.420 --> 00:04:11.750 so I don't need a firewall 00:04:11.750 --> 00:04:14.270 I don't have any ports open that I need blocking right 00:04:14.270 --> 00:04:16.120 so you don't need this 00:04:16.120 --> 00:04:18.559 strictly speaking you don't need it 00:04:18.559 --> 00:04:20.479 next discipline endpoint protection 00:04:20.479 --> 00:04:24.519 so it started with Trellix this is the 00:04:24.519 --> 00:04:26.773 number one recommendation on Gartner 00:04:26.773 --> 00:04:28.769 I hadn't heard of them there like can make 00:04:28.769 --> 00:04:30.429 a feed joint venture or something 00:04:30.429 --> 00:04:31.434 who cares 00:04:31.434 --> 00:04:34.543 they also have great marketing gibberish 00:04:34.543 --> 00:04:36.304 and then if you look at what happened 00:04:36.304 --> 00:04:39.214 it's like they made it worse 00:04:39.214 --> 00:04:42.955 okay so this didn't apply to me 00:04:42.955 --> 00:04:45.305 either because I don't use snake oil 00:04:45.305 --> 00:04:47.295 let's see the third one password manager 00:04:47.295 --> 00:04:48.530 also very popular 00:04:49.730 --> 00:04:52.320 how it started recommended LastPass 00:04:52.320 --> 00:04:54.250 you probably know where this is going 00:04:54.250 --> 00:04:55.747 Laugther 00:04:57.129 --> 00:04:59.710 yeah they got owned and then 00:04:59.710 --> 00:05:00.892 people got owned 00:05:02.502 --> 00:05:05.241 so you may notice a pattern here 00:05:05.436 --> 00:05:06.916 this didn't apply to me because 00:05:06.916 --> 00:05:08.916 I deserve a password authentication use 00:05:08.916 --> 00:05:10.810 public key which has been available for 00:05:10.810 --> 00:05:14.150 decades right so small bonus 00:05:14.150 --> 00:05:17.109 the last one 2FA 00:05:17.609 --> 00:05:19.789 Gartner recommends Duo which has 00:05:19.789 --> 00:05:22.039 been bought by Cisco but doesn't matter 00:05:23.589 --> 00:05:25.414 so if you look at what Duo does 00:05:25.414 --> 00:05:27.378 your server asks the cloud for 00:05:27.378 --> 00:05:29.877 permission the cloud goes to the telephone 00:05:29.877 --> 00:05:33.590 telephone shows a popup you click yes 00:05:31.590 --> 00:05:35.100 and then the cloud tells the server it's 00:05:35.100 --> 00:05:37.470 okay you can let them in if you look 00:05:37.470 --> 00:05:39.360 really closely you can notice the cloud 00:05:39.360 --> 00:05:41.520 doesn't have to do the popup it can just 00:05:41.520 --> 00:05:43.871 say sure so this comes pre-owned 00:05:43.871 --> 00:05:45.952 there is no need to hack anything here 00:05:45.952 --> 00:05:47.452 Laugther 00:05:47.452 --> 00:05:48.980 and something many people don't 00:05:48.980 --> 00:05:50.596 realize you don't need two factor 00:05:50.596 --> 00:05:53.410 if you have public key that's already the second factor 00:05:53.944 --> 00:05:55.109 Okay, so 00:05:55.789 --> 00:05:57.808 yeah let's skip over this briefly 00:05:57.808 --> 00:06:00.318 Splunk is the the recommend option here 00:06:00.318 --> 00:06:02.038 and they make the organization 00:06:02.038 --> 00:06:04.438 more resilient unless you install it 00:06:04.438 --> 00:06:07.279 Laughter 00:06:07.279 --> 00:06:15.543 Applause 00:06:15.543 --> 00:06:17.812 okay so this one is dear to my heart 00:06:17.812 --> 00:06:20.713 because people start arguing about 00:06:20.713 --> 00:06:22.453 whether to install patches and 00:06:22.453 --> 00:06:25.093 which patch to install first and it used 00:06:25.093 --> 00:06:27.683 to be simple you look for problems 00:06:27.683 --> 00:06:29.443 then you install the patches and then 00:06:29.443 --> 00:06:31.533 it got a bit more complicated and 00:06:31.533 --> 00:06:33.423 the result is this right 00:06:33.423 --> 00:06:36.173 that's a famous podcast in Germany 00:06:36.173 --> 00:06:38.693 it's about municipality who got owned 00:06:38.693 --> 00:06:41.673 by ransomware and then had to call the 00:06:41.673 --> 00:06:42.943 army for help 00:06:42.943 --> 00:06:44.460 inaudible chatter in crowd 00:06:44.460 --> 00:06:46.510 and what you should do I'm having 00:06:46.510 --> 00:06:48.470 this for completeness install all patches 00:06:48.470 --> 00:06:50.430 immediately but that's a separate talk 00:06:50.430 --> 00:06:52.705 right so you may notice a pattern here 00:06:52.705 --> 00:06:54.450 the IT security industry 00:06:54.450 --> 00:06:55.630 recommends something and 00:06:55.630 --> 00:06:58.274 if you do it you're [ __ ] so don't do it 00:06:58.274 --> 00:07:01.000 in case you can't read this says snake 00:07:01.000 --> 00:07:03.460 repellent granules and then there's a 00:07:03.460 --> 00:07:05.060 snake sleeping next to it 00:07:05.060 --> 00:07:06.111 laugther 00:07:06.111 --> 00:07:07.390 coughing 00:07:07.921 --> 00:07:10.670 right so if we can't trust the 00:07:10.670 --> 00:07:12.911 recommendations of the industry what shall we do 00:07:13.449 --> 00:07:15.049 and so I had a lot of 00:07:15.049 --> 00:07:16.929 time on my hands because I didn't have 00:07:16.929 --> 00:07:19.510 to clean up after crappy IT security 00:07:19.510 --> 00:07:21.570 industry recommendations so what 00:07:21.570 --> 00:07:23.770 what did I do with my time 00:07:24.210 --> 00:07:26.630 and I decided I need a Blog 00:07:26.630 --> 00:07:30.440 some time ago now and I started 00:07:30.440 --> 00:07:32.660 thinking what do I need and it's 00:07:32.660 --> 00:07:34.570 actually not that much I could have just 00:07:34.570 --> 00:07:37.590 shown basically static content a little 00:07:37.590 --> 00:07:39.727 search function would be good but it's 00:07:39.727 --> 00:07:42.530 optional um I didn't need comments for 00:07:42.530 --> 00:07:44.920 legal reasons because people start 00:07:44.920 --> 00:07:48.390 posting like links to maware or 00:07:48.390 --> 00:07:50.230 whatever I don't want that I don't 00:07:50.230 --> 00:07:52.162 need that right so the first version was 00:07:52.162 --> 00:07:53.950 actually really easy it was a small 00:07:53.950 --> 00:07:56.141 standard web server and I had the 00:07:56.141 --> 00:07:58.219 blog entries a static HTML files 00:07:58.219 --> 00:08:00.199 one file per month it was actually really 00:08:00.199 --> 00:08:02.090 easy if you want to search you just can 00:08:02.090 --> 00:08:04.870 ask Google and limit it to my site so 00:08:04.870 --> 00:08:07.229 posting was also easy had a little 00:08:07.229 --> 00:08:09.699 script that I could run on the server 00:08:09.699 --> 00:08:12.924 and I just SSH in and SSH I trust for 00:08:12.924 --> 00:08:14.824 authentication so there's no new attack 00:08:14.824 --> 00:08:17.445 surface I have that anyway and this is a 00:08:17.445 --> 00:08:20.074 great design it's secure it's simple 00:08:20.074 --> 00:08:22.190 there's low risk it's also high 00:08:22.190 --> 00:08:24.779 performance but you couldn't do a talk 00:08:24.779 --> 00:08:27.270 about it at the CCC right so 00:08:27.270 --> 00:08:30.130 it's too boring so I started to introduce 00:08:30.130 --> 00:08:31.200 risk in my setup 00:08:31.200 --> 00:08:33.640 *laughter 00:08:34.400 --> 00:08:36.410 so the first idea was I had 00:08:36.410 --> 00:08:38.280 written a small web server I could just 00:08:38.280 --> 00:08:40.360 implement the blog in the web server 00:08:40.360 --> 00:08:43.384 because you know it's my code anyway 00:08:43.384 --> 00:08:46.796 but that has downsides if the the blog 00:08:46.796 --> 00:08:48.935 is running in the web server then it can 00:08:48.935 --> 00:08:50.846 access all the memory of the web server 00:08:50.846 --> 00:08:52.776 in particular it can see the TLS private 00:08:52.776 --> 00:08:55.166 key and that I don't want people to 00:08:55.166 --> 00:08:57.856 extract right so it can't be a module 00:08:57.856 --> 00:09:00.056 in the web server 00:09:00.480 --> 00:09:03.030 and the the obvious solution is 00:09:03.030 --> 00:09:05.510 it has to run in a different user ID on 00:09:05.510 --> 00:09:08.090 on Linux I'm using Linux or but any 00:09:08.090 --> 00:09:09.810 Unix or Windows would be the same 00:09:09.810 --> 00:09:11.860 basically it runs in a different user ID 00:09:11.860 --> 00:09:13.940 and then if you if you take over the 00:09:13.940 --> 00:09:15.989 process of the blog because there's some 00:09:15.989 --> 00:09:18.680 bug in it you couldn't access the TLS 00:09:18.680 --> 00:09:21.770 key and while I did that the industry 00:09:21.770 --> 00:09:23.049 was doing this 00:09:23.049 --> 00:09:23.759 chatter 00:09:23.759 --> 00:09:25.429 that's like the running gag of this 00:09:25.429 --> 00:09:27.520 talk I show all kinds of interesting 00:09:27.520 --> 00:09:29.280 things the industry did and then show 00:09:29.280 --> 00:09:31.209 what I did in that time right so 00:09:31.939 --> 00:09:32.828 next question 00:09:32.828 --> 00:09:34.749 where's the content I could just have 00:09:34.749 --> 00:09:37.418 files on disk like static HTML as before 00:09:37.418 --> 00:09:39.819 but I think that's not professional enough 00:09:39.569 --> 00:09:41.829 right so for a good CCC talk you 00:09:41.829 --> 00:09:44.059 need to be more professional 00:09:44.059 --> 00:09:45.260 also for a different 00:09:45.260 --> 00:09:47.488 project I had just written an LDAP server 00:09:47.488 --> 00:09:50.543 so I decided to reuse it and 00:09:50.543 --> 00:09:52.400 while I did that the industry did this 00:09:52.400 --> 00:09:54.080 I took this photo at the airport of 00:09:53.830 --> 00:09:55.731 Jerusalem so this is an actual ad it's 00:09:55.731 --> 00:09:57.210 not photoshopped right it's for 00:09:57.210 --> 00:09:59.040 Northrop Grumman which is a 00:09:59.040 --> 00:10:02.760 military contractor and it's about full 00:10:02.760 --> 00:10:05.700 spectrum cyber across all domains 00:10:05.700 --> 00:10:06.933 chatter 00:10:06.933 --> 00:10:09.770 so why would I write my own LDAP server 00:10:09.770 --> 00:10:11.870 mostly because it's small and 00:10:11.870 --> 00:10:14.650 because I'm an auditor by trade I know 00:10:14.650 --> 00:10:17.630 that if you want a chance to actually 00:10:17.630 --> 00:10:19.570 audit the code it needs to be small 00:10:19.570 --> 00:10:22.039 because that's a limited resource 00:10:22.039 --> 00:10:24.110 the time you can spend on auditing code 00:10:24.110 --> 00:10:27.419 right so Postgres is a common SQL 00:10:27.419 --> 00:10:30.122 database slapped in the the open LDAP 00:10:30.122 --> 00:10:32.621 implementation of the server and tinyldap 00:10:32.621 --> 00:10:35.112 is mine and you see it's much slower 00:10:35.112 --> 00:10:36.630 and much smaller 00:10:38.750 --> 00:10:40.609 yeah so there was more to this 00:10:40.609 --> 00:10:43.760 ad campaign I collected a few funny images 00:10:45.080 --> 00:10:48.959 right so um if someone manages to 00:10:48.709 --> 00:10:52.069 hack the blog CGI or whatever module 00:10:52.069 --> 00:10:54.779 I use to to have connect the blog to the 00:10:54.779 --> 00:10:57.399 web server they can open any file that 00:10:57.399 --> 00:11:00.280 the blog can read right the UID can read 00:11:00.280 --> 00:11:02.820 so I should probably do something 00:11:02.820 --> 00:11:05.510 about that that was the next step and 00:11:05.510 --> 00:11:07.690 the industry was starting to think about 00:11:07.690 --> 00:11:09.180 vulnerability management 00:11:11.070 --> 00:11:13.360 so there is a mechanism on Unix 00:11:13.360 --> 00:11:15.450 on Linux I did a separate talk about that 00:11:15.450 --> 00:11:16.630 on the last Congress 00:11:16.630 --> 00:11:19.132 it's called Seccomp and Seccomp it's like 00:11:19.132 --> 00:11:21.371 a firewall for sys calls so I can use 00:11:21.371 --> 00:11:24.372 Seccomp to block open the open sys which 00:11:24.372 --> 00:11:26.812 is used to open files but if I have 00:11:26.812 --> 00:11:29.092 to use open myself 00:11:29.092 --> 00:11:31.722 then I can't block it right so what 00:11:31.722 --> 00:11:33.452 to do about that for example my blog 00:11:33.452 --> 00:11:35.672 calls local time which converts Unix's 00:11:35.672 --> 00:11:38.092 time into the local time zone and for 00:11:38.092 --> 00:11:40.372 that it opens a file containing the 00:11:40.372 --> 00:11:43.826 description of the system time zone 00:11:43.826 --> 00:11:46.646 and that calls open right so if 00:11:46.646 --> 00:11:49.332 I just disabled the open system call from 00:11:49.332 --> 00:11:51.057 my blog then it couldn't do the time 00:11:51.057 --> 00:11:54.356 translation and this is actually 00:11:54.356 --> 00:11:57.506 an old problem that also applies to set 00:11:57.506 --> 00:12:00.108 ID programs and has has applied to them 00:12:00.108 --> 00:12:03.027 for decades so what you can do is you 00:12:03.027 --> 00:12:05.818 can reorganize your code so before you 00:12:05.818 --> 00:12:08.478 block or before you drop privileges 00:12:08.478 --> 00:12:11.356 generally speaking you do the open 00:12:11.356 --> 00:12:14.158 calls in this in this example and 00:12:14.158 --> 00:12:16.597 then you disable open and then you look 00:12:16.597 --> 00:12:18.970 at the the data provided by the attacker 00:12:18.970 --> 00:12:21.079 because if the attacker or any untrusted 00:12:21.079 --> 00:12:23.590 source is trying to hack you it is via 00:12:23.590 --> 00:12:25.704 data it gives you right it's 00:12:25.704 --> 00:12:27.884 the environment is compromised so you look 00:12:27.884 --> 00:12:29.844 at what kind of uh elements in the 00:12:29.844 --> 00:12:31.764 environment are attacker supplied and 00:12:31.764 --> 00:12:33.804 before you look at a single byte in them 00:12:33.804 --> 00:12:35.924 you do all the dangerous stuff if you can 00:12:35.924 --> 00:12:38.203 right so in this case I call local 00:12:38.203 --> 00:12:42.213 time once before I drop the open sys call 00:12:42.213 --> 00:12:44.904 and then my libc will cache the 00:12:44.904 --> 00:12:47.938 time zone data and the next time I call it 00:12:47.938 --> 00:12:49.868 after I have looked at the attacker 00:12:49.868 --> 00:12:51.877 supplied code there is no need to call 00:12:51.877 --> 00:12:53.988 open right so that's a major advantage 00:12:53.988 --> 00:12:57.488 of Secom over similar Technologies like 00:12:57.488 --> 00:13:03.200 SELinux where all the prohibitions 00:13:03.200 --> 00:13:04.450 on sys calls are 00:13:04.450 --> 00:13:06.850 applied to the whole process so there is 00:13:06.850 --> 00:13:08.656 this is an example and you should make 00:13:08.656 --> 00:13:10.249 use of it you should look at your 00:13:10.249 --> 00:13:12.120 process and you can see if you have the 00:13:12.120 --> 00:13:13.944 source code at least you can see which 00:13:13.944 --> 00:13:16.249 parts do I need to do before I can drop 00:13:16.249 --> 00:13:18.689 privileges and you move them up right so 00:13:18.689 --> 00:13:19.849 that's what I did 00:13:22.120 --> 00:13:24.669 this is actually a mockup from 00:13:24.669 --> 00:13:27.450 the Estonian cyber security center 00:13:28.760 --> 00:13:29.962 so this is real 00:13:30.952 --> 00:13:31.952 okay so 00:13:31.952 --> 00:13:34.959 next thought so let's 00:13:34.959 --> 00:13:38.129 say someone hacks the blog module and 00:13:38.129 --> 00:13:40.400 someone else uses the same module but 00:13:40.400 --> 00:13:43.141 supplies a password right 00:13:43.141 --> 00:13:44.955 this is a common problem in website 00:13:44.955 --> 00:13:46.845 in websites there's some kind of login 00:13:46.845 --> 00:13:48.704 something you get maybe a session token 00:13:48.704 --> 00:13:51.514 or whatever and if someone manages to 00:13:51.514 --> 00:13:54.024 take over the middleware 00:13:54.024 --> 00:13:55.574 or like the server component 00:13:55.584 --> 00:13:58.891 they can see all other connections too 00:13:58.891 --> 00:14:00.420 if they are handled by the same 00:14:00.420 --> 00:14:03.460 process right that's a major problem 00:14:03.460 --> 00:14:06.340 and you can do something about it 00:14:06.340 --> 00:14:08.312 so that's the good news here 00:14:09.682 --> 00:14:13.019 and in my example it led to me using CGI 00:14:13.019 --> 00:14:15.599 instead of fast CGI which is fast CGI 00:14:15.599 --> 00:14:17.953 is a newer version of CGI 00:14:17.953 --> 00:14:20.910 and the idea with fast CGI is that you 00:14:20.910 --> 00:14:24.189 don't spawn a new process for every 00:14:24.189 --> 00:14:26.877 request but you have like a Unix domain 00:14:26.877 --> 00:14:29.890 socket or another socket to a fast CGI 00:14:29.890 --> 00:14:32.180 process and that opens maybe a threat 00:14:32.180 --> 00:14:35.550 per request or something but usually 00:14:35.550 --> 00:14:37.450 in fast CGI you try to handle the 00:14:37.450 --> 00:14:39.440 requests in the same process and then 00:14:39.440 --> 00:14:41.590 you can use that process to cach data so 00:14:41.590 --> 00:14:45.140 there's a perf advantage to using fast CGI 00:14:45.140 --> 00:14:47.300 but for security reasons I don't 00:14:47.300 --> 00:14:50.220 I don't use fast CGI so I can't do 00:14:50.220 --> 00:14:52.700 caching right so that's a major downside 00:14:52.700 --> 00:14:54.450 and you would expect the block to be 00:14:54.450 --> 00:14:56.790 really really slow in the end so 00:14:56.790 --> 00:14:59.139 first thing I need to use CGI instead of 00:14:59.139 --> 00:15:01.949 fast CGI and secondly you could still 00:15:01.949 --> 00:15:05.159 use debug APIs so if you use GDB or 00:15:05.159 --> 00:15:07.700 another debugger to to look at another 00:15:07.700 --> 00:15:10.199 process they use an API called ptrace 00:15:10.199 --> 00:15:12.860 but that's a sys call so I can use seccomp 00:15:12.860 --> 00:15:16.394 to disallow ptrace if I do those two 00:15:16.394 --> 00:15:20.299 and the attacker takes over a blog process 00:15:20.299 --> 00:15:22.529 all they can see is the data they supply 00:15:22.529 --> 00:15:26.840 themselves right that's a major advantage 00:15:27.879 --> 00:15:30.079 Okay so ENISA is actually an EU agency 00:15:30.079 --> 00:15:31.569 which I find really disturbing 00:15:31.569 --> 00:15:33.480 because they're burning lots of taxpayer 00:15:33.480 --> 00:15:38.302 money anyway so let's assume the attacker 00:15:38.302 --> 00:15:41.013 can hack my blog they can sill circumvent 00:15:41.013 --> 00:15:43.333 any access control I do in the blog 00:15:43.333 --> 00:15:46.302 so for example if I have an admin site 00:15:46.302 --> 00:15:49.453 or some login site part of the webiste 00:15:49.453 --> 00:15:52.128 and it's handled through the same program 00:15:52.128 --> 00:15:55.069 and the access control is done in the blog 00:15:55.069 --> 00:15:56.939 CGI and someone manages 00:15:56.939 --> 00:15:59.190 to hack my blog CGI they could 00:15:59.190 --> 00:16:03.280 just skip that so it's really hard 00:16:03.280 --> 00:16:05.640 to do access restrictions that can be 00:16:05.640 --> 00:16:07.817 circumvented if you do them in your own 00:16:07.817 --> 00:16:09.972 code so the solution is not do it in 00:16:09.972 --> 00:16:13.421 your own code I don't do any access 00:16:13.421 --> 00:16:15.702 restriction in the blog I do it in the 00:16:15.702 --> 00:16:18.431 LDAP server so if you connect to my blog 00:16:18.431 --> 00:16:20.525 and supply a password then the blog 00:16:20.525 --> 00:16:22.000 doesn't know if the password is 00:16:22.000 --> 00:16:24.400 right or not there's an for example 00:16:24.400 --> 00:16:26.216 there's an interface where you can add 00:16:26.216 --> 00:16:28.130 new block entries or you can edit an old 00:16:28.130 --> 00:16:29.739 one and for you need to supply 00:16:29.739 --> 00:16:31.740 credentials but the block CGI doesn't know 00:16:31.740 --> 00:16:33.404 if they are right or not it opens 00:16:33.404 --> 00:16:35.264 the connections to the LDAP server with 00:16:35.264 --> 00:16:37.344 that credential and then the LDAP server 00:16:37.344 --> 00:16:40.853 says yes or no so since we removed 00:16:40.853 --> 00:16:44.434 access to the ptraces calls and the 00:16:44.434 --> 00:16:46.613 processes are isolated from each other 00:16:46.613 --> 00:16:48.234 that means there is nothing to 00:16:48.234 --> 00:16:50.394 circumvent here so if someone hacks my 00:16:50.394 --> 00:16:52.733 blog the only advantage they get is 00:16:52.733 --> 00:16:54.769 they can do the exact same stuff they 00:16:54.769 --> 00:16:56.628 could do before basically they can just 00:16:56.628 --> 00:16:58.038 talk to the LDAP server 00:16:59.628 --> 00:17:01.229 okay so I'm starting to get into 00:17:01.229 --> 00:17:04.243 James Bond territory here right 00:17:04.243 --> 00:17:05.874 with the attacks they getting more 00:17:05.874 --> 00:17:08.884 convoluted right so the industry started 00:17:08.884 --> 00:17:10.653 doing threat intelligence feeds which 00:17:10.653 --> 00:17:12.634 are useless don't spend money on those 00:17:13.100 --> 00:17:15.820 okay so let's say the attacker hacked my 00:17:15.820 --> 00:17:19.070 blog and then went to my tinyldap and now 00:17:19.070 --> 00:17:21.820 is attacking tinyldap then they can 00:17:21.820 --> 00:17:24.060 watch other logins because tinyldap 00:17:24.060 --> 00:17:26.552 handles connections from other instances 00:17:26.552 --> 00:17:28.970 of the blog too right so the same 00:17:28.970 --> 00:17:30.840 problem we had before we just moved the 00:17:30.840 --> 00:17:33.119 goal post a little and we need to 00:17:33.119 --> 00:17:36.029 prevent this and the obvious solution 00:17:36.029 --> 00:17:38.118 is to do the same thing we did 00:17:38.118 --> 00:17:41.369 with the blog we have one process of 00:17:41.369 --> 00:17:44.794 the LDAP server per request and then we 00:17:44.794 --> 00:17:48.793 just allow ptrace right so now you 00:17:48.793 --> 00:17:51.349 can't watch even if you get code execution 00:17:51.349 --> 00:17:53.590 inside the LDAP server you can't watch 00:17:53.590 --> 00:17:55.520 what passwords other people use 00:17:55.520 --> 00:17:58.614 you can still see okay the industry 00:17:58.614 --> 00:18:01.150 does some [ __ ] again you can still see 00:18:01.150 --> 00:18:04.216 the password in the LDAP store right so 00:18:04.216 --> 00:18:06.196 the LDAP server has to have a version of 00:18:06.196 --> 00:18:08.277 the password to authenticate against and 00:18:08.277 --> 00:18:11.000 the industry practice best practice is to 00:18:11.000 --> 00:18:12.820 use salted hashes so the password is 00:18:12.820 --> 00:18:14.083 not actually in the store 00:18:14.569 --> 00:18:17.169 still if someone manages to attack 00:18:17.169 --> 00:18:19.749 tinyldap through the blog they can 00:18:19.749 --> 00:18:21.689 extract the hashes and try to crack them 00:18:21.689 --> 00:18:24.728 but since I'm the only one adding users 00:18:24.728 --> 00:18:27.530 I can control the password complexity so 00:18:27.530 --> 00:18:29.780 good luck brute forcing that right 00:18:32.410 --> 00:18:37.729 okay so this is actually a real problem 00:18:37.729 --> 00:18:39.400 not for my blog specifically 00:18:39.400 --> 00:18:41.597 but for other web services or services 00:18:41.597 --> 00:18:43.310 that are reachable from the internet 00:18:43.310 --> 00:18:45.259 what if an attacker doesn't want to steal 00:18:45.259 --> 00:18:47.762 my data but it wants to encrypt it 00:18:47.762 --> 00:18:50.052 so the ransomware what can you do 00:18:50.052 --> 00:18:53.866 about that and my idea was to make 00:18:53.866 --> 00:18:55.776 the data store read only so the UB 00:18:58.000 --> 00:19:00.679 server has a data store that contains 00:18:58.000 --> 00:19:03.159 all the blog entries and let's read only 00:19:00.679 --> 00:19:05.440 to the add up process you can only read 00:19:03.159 --> 00:19:08.200 from it and if you want to write to it 00:19:05.440 --> 00:19:10.039 for example to add a new entry it gets 00:19:08.200 --> 00:19:10.919 appended to a second file which I call 00:19:10.039 --> 00:19:13.559 the 00:19:10.919 --> 00:19:15.880 journal so SQL databases have a similar 00:19:13.559 --> 00:19:17.760 concept and they use it to to roll back 00:19:15.880 --> 00:19:19.320 transactions I can do the same thing 00:19:17.760 --> 00:19:22.200 it's basically a log 00:19:19.320 --> 00:19:25.159 file and that means um all the 00:19:22.200 --> 00:19:27.360 differences from the last time the store 00:19:25.159 --> 00:19:29.400 was created the Ron store all the 00:19:27.360 --> 00:19:32.240 differences are sequentially in the log 00:19:29.400 --> 00:19:34.320 file in the journal so that that the 00:19:32.240 --> 00:19:36.480 performance gets worse the bigger the 00:19:34.320 --> 00:19:39.480 journal gets so every now and then I 00:19:36.480 --> 00:19:41.600 need to combine the readon part and the 00:19:39.480 --> 00:19:44.120 journal to a new bigger readon part and 00:19:41.600 --> 00:19:44.120 I do that 00:19:44.679 --> 00:19:49.640 manually um because tiny elab couldn't 00:19:47.880 --> 00:19:51.039 do it because I didn't allow tiny elab 00:19:49.640 --> 00:19:54.960 to write the store right that was part 00:19:51.039 --> 00:19:57.120 of the security here and uh so um with 00:19:54.960 --> 00:19:59.000 set comp I can just disable whole CIS 00:19:57.120 --> 00:20:00.880 calls I can also install filters so I 00:19:59.000 --> 00:20:03.679 can say open is allowed but only if you 00:20:00.880 --> 00:20:06.440 use o append o append in the open sis 00:20:03.679 --> 00:20:09.280 call on Unix means every right you do to 00:20:06.440 --> 00:20:12.600 this uh descriptor is automatically 00:20:09.280 --> 00:20:16.159 added to the end so I know if someone 00:20:12.600 --> 00:20:18.840 manages to to access the tiny Elda 00:20:16.159 --> 00:20:20.799 binary and can write to my journal then 00:20:18.840 --> 00:20:22.320 the only place the changes can show up 00:20:20.799 --> 00:20:24.600 is at the end and that's actually a 00:20:22.320 --> 00:20:27.200 really good good thing to have because 00:20:24.600 --> 00:20:29.840 it means if someone hacks me and adds 00:20:27.200 --> 00:20:32.720 junk to my blog I can only remove at the 00:20:29.840 --> 00:20:35.360 end and I'm good again compare that to a 00:20:32.720 --> 00:20:38.320 usual SQL database um if someone wrote 00:20:35.360 --> 00:20:40.919 to the database you need to in to to 00:20:38.320 --> 00:20:42.760 play a backup uh in to restore backup 00:20:40.919 --> 00:20:45.600 because they could have changed anything 00:20:42.760 --> 00:20:47.000 anywhere right so but tiny adup doesn't 00:20:45.600 --> 00:20:48.840 even have file system level permissions 00:20:47.000 --> 00:20:50.880 to change anything in the store so I can 00:20:48.840 --> 00:20:53.320 re re uh sleep 00:20:50.880 --> 00:20:56.440 soundly yeah the industry spent money on 00:20:53.320 --> 00:20:56.440 cyber security mesh 00:20:56.480 --> 00:21:00.480 architecture right so the journal 00:20:58.880 --> 00:21:02.280 integration has to be done by me 00:21:00.480 --> 00:21:05.440 manually out of band so it's not 00:21:02.280 --> 00:21:08.880 something an automated process does um I 00:21:05.440 --> 00:21:10.360 do it manually and when I'm doing it um 00:21:08.880 --> 00:21:12.520 because it's not that much data it's 00:21:10.360 --> 00:21:14.600 like for a week or two I can just read 00:21:12.520 --> 00:21:16.480 it again and see if something doesn't 00:21:14.600 --> 00:21:19.120 look 00:21:16.480 --> 00:21:21.080 right this may not be available to all 00:21:19.120 --> 00:21:22.760 other scenarios but uh you have to 00:21:21.080 --> 00:21:25.200 realize if you have bigger data it's 00:21:22.760 --> 00:21:27.039 usually not all the data that's big most 00:21:25.200 --> 00:21:29.960 of it is usually static and readon and 00:21:27.039 --> 00:21:32.840 then you have some logs that are or you 00:21:29.960 --> 00:21:35.400 know billing data that grows and grows 00:21:32.840 --> 00:21:37.799 but usually there's part of the data and 00:21:35.400 --> 00:21:40.600 this is the the part with the you know 00:21:37.799 --> 00:21:43.679 um uh identifying information personally 00:21:40.600 --> 00:21:46.120 identifying information or you know Bill 00:21:43.679 --> 00:21:48.120 billing details that stuff is usually 00:21:46.120 --> 00:21:51.440 small and mostly static and you could 00:21:48.120 --> 00:21:51.440 use this strategy for that 00:21:52.760 --> 00:21:58.799 too well yeah 00:21:56.159 --> 00:22:01.600 okay so the attack can still write 00:21:58.799 --> 00:22:03.919 garbage to my blog that's still not good 00:22:01.600 --> 00:22:06.760 right but since all they can do is a pen 00:22:03.919 --> 00:22:09.240 to the journal I can use my text editor 00:22:06.760 --> 00:22:11.760 open the journal and truncate at some 00:22:09.240 --> 00:22:13.840 point and then I get all my data back 00:22:11.760 --> 00:22:16.360 till the point where they started puting 00:22:13.840 --> 00:22:18.720 the blog right this is still bad but 00:22:16.360 --> 00:22:21.400 it's it's a very good position to be in 00:22:18.720 --> 00:22:23.919 if there's an uh emergency because you 00:22:21.400 --> 00:22:26.080 can basically investigate calmly first 00:22:23.919 --> 00:22:30.000 you turn off right AIS then you you 00:22:26.080 --> 00:22:32.919 delete the vandalism and the journal and 00:22:30.000 --> 00:22:34.679 um you know you haven't lost anything 00:22:32.919 --> 00:22:37.120 because if you want to delete an entry 00:22:34.679 --> 00:22:39.360 in the blog you could do that too but 00:22:37.120 --> 00:22:41.200 that means at the end of the journal you 00:22:39.360 --> 00:22:43.240 append a statement saying delete this 00:22:41.200 --> 00:22:45.799 record and I can just remove that and I 00:22:43.240 --> 00:22:48.960 get the record back right so there's no 00:22:45.799 --> 00:22:51.120 way for someone vandalizing my blog to U 00:22:48.960 --> 00:22:53.320 damage any data that was in it before 00:22:51.120 --> 00:22:56.000 all they can do is a pen junk at the end 00:22:53.320 --> 00:22:58.400 and I can live with that right this is 00:22:56.000 --> 00:23:01.200 this is should be the guiding thought 00:22:58.400 --> 00:23:03.480 between any security you do um if 00:23:01.200 --> 00:23:05.559 someone hacks you you will be in a very 00:23:03.480 --> 00:23:07.720 stressful position the boss will be 00:23:05.559 --> 00:23:10.279 behind you breathing down your neck are 00:23:07.720 --> 00:23:12.559 We Done Yet is it fixed and you want to 00:23:10.279 --> 00:23:14.600 have as little to do as possible at that 00:23:12.559 --> 00:23:17.279 time you want to to move all the stress 00:23:14.600 --> 00:23:19.120 to before you get hacked because then 00:23:17.279 --> 00:23:22.520 you have more 00:23:19.120 --> 00:23:24.760 time okay the industry did other things 00:23:22.520 --> 00:23:28.039 again 00:23:24.760 --> 00:23:30.880 um so what if the attacker doesn't write 00:23:28.039 --> 00:23:33.360 garbage to the journal but writes some 00:23:30.880 --> 00:23:35.279 exploit to the journal that the next 00:23:33.360 --> 00:23:38.520 tiny El up instance that reads the 00:23:35.279 --> 00:23:41.120 journal gets compromised 00:23:38.520 --> 00:23:43.480 by that is a 00:23:41.120 --> 00:23:46.799 possibility and that would be 00:23:43.480 --> 00:23:49.279 bad so agreed that there still a problem 00:23:46.799 --> 00:23:51.200 but uh realize how Preposterous the 00:23:49.279 --> 00:23:54.039 scenario is so we are talking about an 00:23:51.200 --> 00:23:57.000 attacker who found stable zero day in 00:23:54.039 --> 00:23:59.600 the blog and then used that and another 00:23:57.000 --> 00:24:01.679 stable zero day in tiny ad up to write 00:23:59.600 --> 00:24:05.600 to the journal and then have the 00:24:01.679 --> 00:24:09.360 third uh third zero day to compromise 00:24:05.600 --> 00:24:11.440 the the journal passing code so I mean 00:24:09.360 --> 00:24:13.440 yes it is still a problem but we reduced 00:24:11.440 --> 00:24:15.320 the risk 00:24:13.440 --> 00:24:18.320 significantly uh and that is what I'm 00:24:15.320 --> 00:24:20.640 trying to to tell you here uh it's not 00:24:18.320 --> 00:24:22.600 it's not all or nothing it's good enough 00:24:20.640 --> 00:24:25.440 if you can half the 00:24:22.600 --> 00:24:28.760 risk that's already very important and 00:24:25.440 --> 00:24:32.200 you should do it so as much as you can 00:24:28.760 --> 00:24:34.039 uh slice off the risk the better the 00:24:32.200 --> 00:24:37.320 better off you will be if something 00:24:34.039 --> 00:24:40.320 happens right because the smaller the 00:24:37.320 --> 00:24:42.200 code is that is still attackable the 00:24:40.320 --> 00:24:44.000 more you can audit it and be sure it's 00:24:42.200 --> 00:24:46.799 good you show it to your friends and 00:24:44.000 --> 00:24:48.919 they can audit it too uh and and you 00:24:46.799 --> 00:24:50.480 need to save yourself that time because 00:24:48.919 --> 00:24:52.880 it happens every now and then that I get 00:24:50.480 --> 00:24:54.640 to get to see the whole code base and 00:24:52.880 --> 00:24:56.480 the usual code base for commercial 00:24:54.640 --> 00:24:59.799 products is like gigabytes of source 00:24:56.480 --> 00:25:02.039 code nobody can read that like I'm I'm 00:24:59.799 --> 00:25:05.440 good I'm not that 00:25:02.039 --> 00:25:07.000 good so um this is a good place to be in 00:25:05.440 --> 00:25:10.760 I think right so the industry was 00:25:07.000 --> 00:25:13.240 selling dos mitigation sure whatever so 00:25:10.760 --> 00:25:15.760 what happens if someone attacks the web 00:25:13.240 --> 00:25:18.760 server that is still a big 00:25:15.760 --> 00:25:22.799 problem um and it's 00:25:18.760 --> 00:25:24.200 actually uh it it's a full damage right 00:25:22.799 --> 00:25:25.919 that's the worst that can happen if 00:25:24.200 --> 00:25:28.399 someone manages to attack the web server 00:25:25.919 --> 00:25:30.679 they can see all traffic coming through 00:25:28.399 --> 00:25:32.399 they can look inside TLS secured 00:25:30.679 --> 00:25:34.399 connections and they can sniff all the 00:25:32.399 --> 00:25:37.039 passwords so that's really 00:25:34.399 --> 00:25:40.200 bad unfortunately there is not too much 00:25:37.039 --> 00:25:44.679 you can do about that 00:25:40.200 --> 00:25:45.840 um you could do uh um a separation so 00:25:44.679 --> 00:25:47.919 this is something people have been 00:25:45.840 --> 00:25:49.480 talking about for a while open S AG is 00:25:47.919 --> 00:25:51.919 doing this they moved the dangerous 00:25:49.480 --> 00:25:54.840 crypto stuff in a second process and use 00:25:51.919 --> 00:25:56.399 sandboxing to lock down that process uh 00:25:54.840 --> 00:25:58.440 that could be done but nobody has done 00:25:56.399 --> 00:26:00.960 it for open SSL yet so so open SSL 00:25:58.440 --> 00:26:02.960 doesn't support that um my web server 00:26:00.960 --> 00:26:05.200 also supports embed TLS they don't 00:26:02.960 --> 00:26:07.399 support that too so I I could spend time 00:26:05.200 --> 00:26:09.200 on that and I've been actually um 00:26:07.399 --> 00:26:11.000 spending some time already but it's not 00:26:09.200 --> 00:26:13.320 it's not ready yet but this would be a 00:26:11.000 --> 00:26:15.600 good way to reduce the risk and you may 00:26:13.320 --> 00:26:18.600 notice that the the tools I'm using to 00:26:15.600 --> 00:26:20.840 reduce risks are actually just a handful 00:26:18.600 --> 00:26:23.440 there's not it's not you know it's not 00:26:20.840 --> 00:26:25.760 witchcraft I'm I'm not inventing new 00:26:23.440 --> 00:26:28.039 ways to look at things I'm doing the 00:26:25.760 --> 00:26:30.000 same thing again I'm identifying the 00:26:28.039 --> 00:26:32.679 part of the code that's dangerous and 00:26:30.000 --> 00:26:34.640 then I think about how I can make that 00:26:32.679 --> 00:26:37.440 part smaller maybe put it in a different 00:26:34.640 --> 00:26:38.679 process lock it down so we need to do 00:26:37.440 --> 00:26:42.000 the same thing with the web server 00:26:38.679 --> 00:26:46.640 obviously um but it's an ongoing 00:26:42.000 --> 00:26:49.600 process yeah so again whatever um why 00:26:46.640 --> 00:26:51.399 haven't I done that yet uh so in my web 00:26:49.600 --> 00:26:53.360 server you can it's a build time 00:26:51.399 --> 00:26:55.159 decision if you want SSL support or not 00:26:53.360 --> 00:26:57.600 and you can see the binary is 00:26:55.159 --> 00:26:59.360 significantly bigger if you have SSL and 00:26:57.600 --> 00:27:01.320 I'm showing you this because it means 00:26:59.360 --> 00:27:04.520 the the bulk of the attack surface is 00:27:01.320 --> 00:27:06.840 the SSL code it's not my code so if I if 00:27:04.520 --> 00:27:10.320 I can put the SSL code in a different 00:27:06.840 --> 00:27:11.880 process they still need to see the the 00:27:10.320 --> 00:27:13.679 private key because that's what TLS 00:27:11.880 --> 00:27:16.000 needs the private key otherwise it can't 00:27:13.679 --> 00:27:17.679 do the crypto so the bug of the attack 00:27:16.000 --> 00:27:19.919 surface would still have access to the 00:27:17.679 --> 00:27:21.480 key I can still do it because there 00:27:19.919 --> 00:27:24.840 might be bucks in my code and not the 00:27:21.480 --> 00:27:28.039 SSL code but that's just 5% of the of 00:27:24.840 --> 00:27:30.000 the overall attack surface so um 00:27:28.039 --> 00:27:32.480 it I will probably do it at some point 00:27:30.000 --> 00:27:35.799 but it's I don't expect miracles from it 00:27:32.480 --> 00:27:38.919 bugs and open SSL will kill kill me 00:27:35.799 --> 00:27:38.919 there's not much I can do about 00:27:41.480 --> 00:27:45.640 that okay so I know what you're 00:27:46.960 --> 00:27:52.399 thinking what about colel 00:27:50.039 --> 00:27:54.679 bugs so I looked at a few of the recent 00:27:52.399 --> 00:27:57.039 kernel bugs and it turns out that they 00:27:54.679 --> 00:28:00.159 usually apply to SSS that are rarely 00:27:57.039 --> 00:28:01.919 used in regular programs and uh because 00:28:00.159 --> 00:28:05.200 I'm blocking all the CIS calls I don't 00:28:01.919 --> 00:28:07.279 really need none of them apply to me 00:28:05.200 --> 00:28:10.720 right and this is a this is a pattern 00:28:07.279 --> 00:28:11.960 with Colonel bugs um uh there is a a 00:28:10.720 --> 00:28:15.600 project called 00:28:11.960 --> 00:28:19.519 Sandstorm um that also uses p trce and 00:28:15.600 --> 00:28:22.679 and Secom tracing to reduce the csol U 00:28:19.519 --> 00:28:25.240 surface and then puts regular Services 00:28:22.679 --> 00:28:28.200 into a Sandbox for for web services and 00:28:25.240 --> 00:28:30.360 they uh evaded all kinds of of Kernel 00:28:28.200 --> 00:28:32.519 bucks just because of that so this is 00:28:30.360 --> 00:28:34.320 like a zero effort thing because 00:28:32.519 --> 00:28:36.760 obviously if you have a list of CIS 00:28:34.320 --> 00:28:37.840 calls you'd use a white list and you you 00:28:36.760 --> 00:28:39.600 have a list of things you are 00:28:37.840 --> 00:28:42.519 explicitely low and the rest is is 00:28:39.600 --> 00:28:44.600 disabled not the other way around right 00:28:42.519 --> 00:28:47.480 so none of the usual kernel bugs apply 00:28:44.600 --> 00:28:49.519 to me um because of the the seom stuff I 00:28:47.480 --> 00:28:51.960 already do so kernel bugs aren't as big 00:28:49.519 --> 00:28:54.200 of a problem as you might think at least 00:28:51.960 --> 00:28:56.399 I still have them if I haven't patched 00:28:54.200 --> 00:28:58.960 but you can't get to them via the 00:28:56.399 --> 00:29:01.039 blog so I have a small confession to 00:28:58.960 --> 00:29:04.679 make uh I'm a bit of a troll and that 00:29:01.039 --> 00:29:06.960 applies to this project as well so um I 00:29:04.679 --> 00:29:10.799 use the worst programming 00:29:06.960 --> 00:29:12.679 language I used C right so I'm trolling 00:29:10.799 --> 00:29:14.399 the security people and then I'm 00:29:12.679 --> 00:29:15.760 trolling the Java people who have been 00:29:14.399 --> 00:29:17.440 saying you should use multi-threading 00:29:15.760 --> 00:29:20.399 for performance and not have one process 00:29:17.440 --> 00:29:24.360 per request so I'm doing actually two 00:29:20.399 --> 00:29:25.960 fork and xx per request um I'm trolling 00:29:24.360 --> 00:29:28.679 the database people I don't have any 00:29:25.960 --> 00:29:30.279 caching I don't have connection pool TOs 00:29:28.679 --> 00:29:32.320 and the perf people too because I'm 00:29:30.279 --> 00:29:34.640 still faster than most of the regular 00:29:32.320 --> 00:29:36.679 Solutions so there is no there's really 00:29:34.640 --> 00:29:39.799 no downside if you if you architect your 00:29:36.679 --> 00:29:42.120 software to use this kind of thing um it 00:29:39.799 --> 00:29:44.399 will be slower than other ways to do it 00:29:42.120 --> 00:29:47.559 but most other software isn't as fast 00:29:44.399 --> 00:29:49.600 anyway so there's enough Headway that 00:29:47.559 --> 00:29:52.320 you can use to do security instead of 00:29:49.600 --> 00:29:54.679 performance you will still be 00:29:52.320 --> 00:29:58.240 faster so let's recap the the 00:29:54.679 --> 00:30:00.679 methodology I used um first I make a 00:29:58.240 --> 00:30:02.679 list of all the attacks I can think of 00:30:00.679 --> 00:30:04.360 and this means concrete attacks so what 00:30:02.679 --> 00:30:07.000 could happen and what would what would 00:30:04.360 --> 00:30:09.480 be the problem then right and then I 00:30:07.000 --> 00:30:11.880 think for every item on the list I 00:30:09.480 --> 00:30:14.000 consider how to prevent this can I 00:30:11.880 --> 00:30:16.039 prevent this uh what what I need to do 00:30:14.000 --> 00:30:17.640 and then I do it right so that's easy 00:30:16.039 --> 00:30:20.360 it's like this the fine man problem 00:30:17.640 --> 00:30:23.200 solving algorithm in spirit and this 00:30:20.360 --> 00:30:25.519 process is called threat modeling it's 00:30:23.200 --> 00:30:27.320 it's like a it's dirty word because it 00:30:25.519 --> 00:30:28.760 sounds like there's effort involved and 00:30:27.320 --> 00:30:31.480 nobody wants to do it but it's really 00:30:28.760 --> 00:30:32.880 it's easy it's just these these steps 00:30:31.480 --> 00:30:34.360 you you look at your software you 00:30:32.880 --> 00:30:36.279 consider all the ways it could be 00:30:34.360 --> 00:30:38.240 attacked and then you consider what you 00:30:36.279 --> 00:30:39.960 could do to prevent the attack or in 00:30:38.240 --> 00:30:41.320 some cases you can't prevent the attack 00:30:39.960 --> 00:30:43.720 and then you say well that's the risk I 00:30:41.320 --> 00:30:47.240 have to live with right so that's called 00:30:43.720 --> 00:30:50.360 threat moding you should try it it's 00:30:47.240 --> 00:30:52.519 awesome and um you saw that I'm trying 00:30:50.360 --> 00:30:55.320 to optimize something here I go for a 00:30:52.519 --> 00:30:57.919 specific Target in this case I want as 00:30:55.320 --> 00:30:59.840 little code as possible 00:30:57.919 --> 00:31:02.840 um the more code there is the more bugs 00:30:59.840 --> 00:31:04.639 there will be that's an a very old uh 00:31:02.840 --> 00:31:07.000 Insight from I think it was originally 00:31:04.639 --> 00:31:08.880 in IBM study and they basically found 00:31:07.000 --> 00:31:10.480 that the number of bugs in code is a 00:31:08.880 --> 00:31:12.639 function of the lines of code in the 00:31:10.480 --> 00:31:15.399 code so there's a little more to it but 00:31:12.639 --> 00:31:17.679 basically it's true so and it's not just 00:31:15.399 --> 00:31:19.519 any code I want to have less of um if 00:31:17.679 --> 00:31:22.159 the code is dangerous I particularly 00:31:19.519 --> 00:31:25.159 want to have less of it and the the most 00:31:22.159 --> 00:31:27.360 important category to to make smaller is 00:31:25.159 --> 00:31:29.880 the the code that enforces security 00:31:27.360 --> 00:31:31.720 guarantees so like one security 00:31:29.880 --> 00:31:33.320 guarantee would be you can't log in if 00:31:31.720 --> 00:31:35.320 you don't have the right password right 00:31:33.320 --> 00:31:38.559 so the code that checks that I wanted to 00:31:35.320 --> 00:31:40.720 be as small as possible um one or two 00:31:38.559 --> 00:31:42.799 lines of code if if I can manage it and 00:31:40.720 --> 00:31:45.360 then it's obvious if it if it's wrong or 00:31:42.799 --> 00:31:47.720 not the more complex the code is the 00:31:45.360 --> 00:31:49.080 less less easy would it be to see if 00:31:47.720 --> 00:31:51.039 it's correct or not and that's what you 00:31:49.080 --> 00:31:53.519 want in the end you want to be sure the 00:31:51.039 --> 00:31:55.440 code is correct so how far did I get 00:31:53.519 --> 00:31:57.279 it's actually pretty amazing I think um 00:31:55.440 --> 00:32:01.000 you can write an elabs server in five 00:31:57.279 --> 00:32:04.279 ,000 lines of code the blog is 3.5 lines 00:32:01.000 --> 00:32:07.320 of kilo lines of code um plus the Ed 00:32:04.279 --> 00:32:09.159 client Library plus zet lip um but I'm 00:32:07.320 --> 00:32:11.320 only using zet lip to compress not to 00:32:09.159 --> 00:32:13.880 decompress so most attack scenarios 00:32:11.320 --> 00:32:16.279 doesn't don't apply to to my usage of Z 00:32:13.880 --> 00:32:19.000 Li um and the web server is also pretty 00:32:16.279 --> 00:32:21.320 slow if you only look at the HTTP code 00:32:19.000 --> 00:32:23.639 unfortunately uh it also contains the 00:32:21.320 --> 00:32:25.600 SSL Library which is orders of magnitude 00:32:23.639 --> 00:32:28.039 more than my code and that's how you 00:32:25.600 --> 00:32:31.840 want it you want the biggest risk not to 00:32:28.039 --> 00:32:34.519 be in the new code but in an old code 00:32:31.840 --> 00:32:36.440 that someone else already audited if you 00:32:34.519 --> 00:32:38.760 can manage it right so this is the 00:32:36.440 --> 00:32:40.840 optimization strategy try to have as 00:32:38.760 --> 00:32:42.960 little dangerous code as possible sounds 00:32:40.840 --> 00:32:44.679 like a no-brainer but if you look at 00:32:42.960 --> 00:32:47.279 modern software development you will 00:32:44.679 --> 00:32:50.120 find out they do the exact opposite pull 00:32:47.279 --> 00:32:53.159 in as many Frameworks as as they 00:32:50.120 --> 00:32:55.639 can so this strategy is called TCB 00:32:53.159 --> 00:32:57.159 minimization you should try it and I 00:32:55.639 --> 00:33:01.240 gave a talk about it already it's 00:32:57.159 --> 00:33:05.080 actually pretty easy so um I told you 00:33:01.240 --> 00:33:08.080 what I did to the to the blog to uh uh 00:33:05.080 --> 00:33:10.120 diminish the danger that can be done uh 00:33:08.080 --> 00:33:11.919 if someone manages to take it over and 00:33:10.120 --> 00:33:15.000 this is actually part of the TCB 00:33:11.919 --> 00:33:18.279 minimization process so the blog was a 00:33:15.000 --> 00:33:21.440 high risk area and then I took away 00:33:18.279 --> 00:33:24.000 Privileges and removed exess checks and 00:33:21.440 --> 00:33:26.240 in the end even if I give you remote 00:33:24.000 --> 00:33:28.200 code execution in the blog process you 00:33:26.240 --> 00:33:30.679 can't do anything you couldn't do before 00:33:28.200 --> 00:33:33.519 right so it's no longer part of the TCB 00:33:30.679 --> 00:33:35.559 the TCB is the part that uh enforces 00:33:33.519 --> 00:33:36.880 security guarantees which the block CGI 00:33:35.559 --> 00:33:39.440 doesn't 00:33:36.880 --> 00:33:41.360 anymore so that's what you want to do 00:33:39.440 --> 00:33:44.200 you want to end up in the smallest TCB 00:33:41.360 --> 00:33:47.200 you can possibly manage and uh every 00:33:44.200 --> 00:33:49.360 step on the way is good so no step is 00:33:47.200 --> 00:33:51.880 too small right if you can shave off 00:33:49.360 --> 00:33:54.639 even a little routine do 00:33:51.880 --> 00:33:56.960 it this is the minimization part of TCB 00:33:54.639 --> 00:33:59.799 minimization right I could I was able to 00:33:56.960 --> 00:34:03.639 remove the block from the TCB tiny El up 00:33:59.799 --> 00:34:05.360 still still has a risk so I I you saw 00:34:03.639 --> 00:34:07.279 the threat model if someone manages to 00:34:05.360 --> 00:34:08.639 take over tiny El up they can read the 00:34:07.279 --> 00:34:11.440 hashes and try to crack them that's 00:34:08.639 --> 00:34:14.639 still bad um but I can live with it 00:34:11.440 --> 00:34:17.399 right uh if they vandalize the block I 00:34:14.639 --> 00:34:19.960 can undo the damage without going to the 00:34:17.399 --> 00:34:22.280 tape Library so that's 00:34:19.960 --> 00:34:23.960 good if you compare that to the industry 00:34:22.280 --> 00:34:26.720 standard you you will find that my 00:34:23.960 --> 00:34:28.560 Approach is much better um usually in 00:34:26.720 --> 00:34:31.200 the industry you see platform decisions 00:34:28.560 --> 00:34:33.480 done by management not by the techies 00:34:31.200 --> 00:34:35.399 and um it's untroubled by expertise or 00:34:33.480 --> 00:34:37.800 risk analysis and you you get a 00:34:35.399 --> 00:34:39.720 diffusion of responsibility because if 00:34:37.800 --> 00:34:41.599 you even if you try to find out who's 00:34:39.720 --> 00:34:43.240 responsible for anything you find uh 00:34:41.599 --> 00:34:44.960 well it's that team over there but we 00:34:43.240 --> 00:34:47.040 don't really know and then you find out 00:34:44.960 --> 00:34:48.159 the team dissolved last week and it's 00:34:47.040 --> 00:34:50.919 really 00:34:48.159 --> 00:34:54.560 horrible and brand new we have ai tools 00:34:50.919 --> 00:34:54.560 which is also a diffusion of 00:34:55.200 --> 00:34:59.000 responsibility and then you get people 00:34:57.160 --> 00:35:00.880 arguing well it's so bad it can't get 00:34:59.000 --> 00:35:02.760 any worse let's go to the cloud where 00:35:00.880 --> 00:35:07.079 obviously it gets worse 00:35:02.760 --> 00:35:08.520 immediately so I prefer my way um I 00:35:07.079 --> 00:35:10.640 think in the end it's important to 00:35:08.520 --> 00:35:12.920 realize that the the lack of security 00:35:10.640 --> 00:35:16.440 you may have in your projects right now 00:35:12.920 --> 00:35:18.400 is self-imposed there is no guy with a 00:35:16.440 --> 00:35:20.480 shotgun behind you 00:35:18.400 --> 00:35:23.800 threatening you can do it you just have 00:35:20.480 --> 00:35:25.640 to start right so this is self-imposed 00:35:23.800 --> 00:35:28.800 helplessness you can actually help 00:35:25.640 --> 00:35:28.800 yourself you just have to start 00:35:29.440 --> 00:35:34.160 right how did we get here this is 00:35:32.079 --> 00:35:36.119 obviously not a good good place to be 00:35:34.160 --> 00:35:37.800 like all the software is crappy and 00:35:36.119 --> 00:35:40.200 there's a few it's not just that people 00:35:37.800 --> 00:35:43.440 are dumb there's a few reasons for that 00:35:40.200 --> 00:35:45.359 so um back in the day you used to have 00:35:43.440 --> 00:35:48.200 bespoke applications that were written 00:35:45.359 --> 00:35:50.079 for a specific purpose and they used the 00:35:48.200 --> 00:35:52.359 waterfall model and you had the 00:35:50.079 --> 00:35:55.560 requirements specification and it was 00:35:52.359 --> 00:35:58.079 lots of bureaucracy and really horrible 00:35:55.560 --> 00:36:00.200 but it also Al meant that you knew what 00:35:58.079 --> 00:36:02.880 the application had be had to be able to 00:36:00.200 --> 00:36:06.240 do so that means you can make sure 00:36:02.880 --> 00:36:08.079 anything else is forbidden if you know 00:36:06.240 --> 00:36:10.040 what the application needs to be able to 00:36:08.079 --> 00:36:12.400 do you can make sure it doesn't do any 00:36:10.040 --> 00:36:15.520 other stuff and that is security if you 00:36:12.400 --> 00:36:17.280 think about it deny everything that the 00:36:15.520 --> 00:36:19.280 application wasn't supposed to be doing 00:36:17.280 --> 00:36:22.200 and then that's what an attacker would 00:36:19.280 --> 00:36:24.680 do if they take over the machine right 00:36:22.200 --> 00:36:26.240 so if you know beforehand what you're 00:36:24.680 --> 00:36:28.680 trying to get to you can actually 00:36:26.240 --> 00:36:30.319 implement privilege even architecturally 00:36:28.680 --> 00:36:32.920 as I've shown 00:36:30.319 --> 00:36:35.720 you now we have more of an Ikea model 00:36:32.920 --> 00:36:37.560 you buy parts that are uh designed by 00:36:35.720 --> 00:36:39.359 their own teams and the teams designing 00:36:37.560 --> 00:36:42.440 the parts don't know what the final 00:36:39.359 --> 00:36:44.240 product will look like right in in some 00:36:42.440 --> 00:36:45.640 cases even you don't know what the final 00:36:44.240 --> 00:36:47.920 product will look like but it's even 00:36:45.640 --> 00:36:49.880 worse if you consider that the the the 00:36:47.920 --> 00:36:51.480 team building the part you make your 00:36:49.880 --> 00:36:53.760 software from doesn't know what it will 00:36:51.480 --> 00:36:56.359 be used for so it has to be as generic 00:36:53.760 --> 00:36:57.839 as possible Right the more it can be 00:36:56.359 --> 00:37:00.680 done with with it the better and that's 00:36:57.839 --> 00:37:03.119 the opposite of security right security 00:37:00.680 --> 00:37:05.359 means understanding what you need to do 00:37:03.119 --> 00:37:08.599 and then disallowing the rest and this 00:37:05.359 --> 00:37:11.440 means be as generic as you can the parts 00:37:08.599 --> 00:37:12.400 are optimized for genericity Gen what's 00:37:11.440 --> 00:37:15.599 the 00:37:12.400 --> 00:37:17.680 name genericism I don't know so they are 00:37:15.599 --> 00:37:21.319 optimized to be as flexible as possible 00:37:17.680 --> 00:37:21.319 and they are chosen by 00:37:21.599 --> 00:37:25.079 flexibility the developer of the part 00:37:23.640 --> 00:37:27.599 usually has no idea what it would used 00:37:25.079 --> 00:37:31.040 for uh and that means you can't do least 00:37:27.599 --> 00:37:33.760 privilege because um you don't know what 00:37:31.040 --> 00:37:36.319 the privilege will be that's least so 00:37:33.760 --> 00:37:38.520 this this is actually a big mess so if 00:37:36.319 --> 00:37:40.480 you use Parts programmed by other people 00:37:38.520 --> 00:37:42.680 you will have to invest extra effort to 00:37:40.480 --> 00:37:45.480 find out what kind of stuff you can make 00:37:42.680 --> 00:37:47.599 it not do because it will definitely be 00:37:45.480 --> 00:37:49.440 able to do more than you need and the 00:37:47.599 --> 00:37:52.040 more you can clamp down the more 00:37:49.440 --> 00:37:53.720 security you will have uh it's even 00:37:52.040 --> 00:37:55.079 worse if you do Agile development 00:37:53.720 --> 00:37:58.079 because then by definition you don't 00:37:55.079 --> 00:37:59.520 know what the end result will be so if 00:37:58.079 --> 00:38:00.880 you don't know that you can't do 00:37:59.520 --> 00:38:03.319 security 00:38:00.880 --> 00:38:05.640 lockdown so another argument why we got 00:38:03.319 --> 00:38:07.520 here is economics of scale so it used to 00:38:05.640 --> 00:38:10.880 be that if you build some kind of device 00:38:07.520 --> 00:38:13.280 that needs to do something like I don't 00:38:10.880 --> 00:38:17.400 know uh a 00:38:13.280 --> 00:38:19.680 microwave then you you find parts and 00:38:17.400 --> 00:38:21.359 you combine the parts and you solder 00:38:19.680 --> 00:38:24.119 them together and then they solve the 00:38:21.359 --> 00:38:27.160 problem but these days uh you don't 00:38:24.119 --> 00:38:29.680 solder parts anymore you assemble from 00:38:27.160 --> 00:38:32.280 pre-made parts and these are usually 00:38:29.680 --> 00:38:35.280 programmable right so a little arm chip 00:38:32.280 --> 00:38:37.040 cost like a tenth of a scent so why use 00:38:35.280 --> 00:38:38.800 a special part if you can use an arm 00:38:37.040 --> 00:38:40.880 chip and then program it but that means 00:38:38.800 --> 00:38:43.000 you still need to use software that 00:38:40.880 --> 00:38:44.640 actually solves the problem the hardware 00:38:43.000 --> 00:38:47.000 is generic and that means the hardware 00:38:44.640 --> 00:38:49.800 can be hacked and this is turning out to 00:38:47.000 --> 00:38:53.359 be a problem right if you had a break in 00:38:49.800 --> 00:38:54.640 in 20 years youo um it it breaked right 00:38:53.359 --> 00:38:57.040 but now it's 00:38:54.640 --> 00:38:59.040 programmable and people have realized 00:38:57.040 --> 00:39:01.200 how bad that is but it is bad right so 00:38:59.040 --> 00:39:05.480 that's that will bite Us in the 00:39:01.200 --> 00:39:07.680 ass oops so um the response from the 00:39:05.480 --> 00:39:10.440 industry has so far been the ostrich 00:39:07.680 --> 00:39:13.000 method basically we we install stuff 00:39:10.440 --> 00:39:14.880 that we know is untrustworthy and so we 00:39:13.000 --> 00:39:17.680 install other stuff on top of it that's 00:39:14.880 --> 00:39:20.720 also untrustworthy and then we call it 00:39:17.680 --> 00:39:24.119 Telemetry or big data and to some risk 00:39:20.720 --> 00:39:26.599 uh logging analysis in in aze or 00:39:24.119 --> 00:39:29.640 whatever uh and in the end the attack 00:39:26.599 --> 00:39:31.839 surface has mushroomed like a nuclear 00:39:29.640 --> 00:39:34.240 explosion right so that's our fault 00:39:31.839 --> 00:39:36.000 nobody has forced us to do this you 00:39:34.240 --> 00:39:39.079 don't need to do this in your own 00:39:36.000 --> 00:39:41.119 projects that's the hopeful message of 00:39:39.079 --> 00:39:42.640 this talk in conclusion if you remember 00:39:41.119 --> 00:39:44.079 nothing else from this talk remember 00:39:42.640 --> 00:39:46.520 that threat modeling is a thing and you 00:39:44.079 --> 00:39:48.480 should try it TCB minimization actually 00:39:46.520 --> 00:39:51.680 helps least privilege is another facet 00:39:48.480 --> 00:39:53.800 of the same thing and if you can uh use 00:39:51.680 --> 00:39:56.440 a pendon data storage you should 00:39:53.800 --> 00:39:58.359 consider it hm blockchain yeah not 00:39:56.440 --> 00:40:00.560 blockchain a pend only data storage it's 00:39:58.359 --> 00:40:00.560 not 00:40:00.630 --> 00:40:08.820 [Applause] 00:40:09.000 --> 00:40:13.240 [Music] 00:40:10.720 --> 00:40:15.200 blockchain so two more you two more 00:40:13.240 --> 00:40:18.160 slides yeah two more slides sorry I'm an 00:40:15.200 --> 00:40:20.480 imposter no problem so the rule of thumb 00:40:18.160 --> 00:40:23.480 should be if if the blog of some 00:40:20.480 --> 00:40:26.160 unwashed hobbyist from the Internet is 00:40:23.480 --> 00:40:28.040 more secure than your it security then 00:40:26.160 --> 00:40:30.359 you should improve your it 00:40:28.040 --> 00:40:33.760 security right that shouldn't 00:40:30.359 --> 00:40:35.400 happen all right so that's all from my 00:40:33.760 --> 00:40:38.319 talk I think we still have time for 00:40:35.400 --> 00:40:41.560 questions do we yes okay awesome okay 00:40:38.319 --> 00:40:41.560 now you can put your hand 00:40:45.040 --> 00:40:49.599 [Applause] 00:40:47.280 --> 00:40:51.280 together so if you want to ask a 00:40:49.599 --> 00:40:55.720 question we have four microphones in the 00:40:51.280 --> 00:40:56.880 room 1 2 3 4 and I'm going to take a a 00:40:55.720 --> 00:40:59.760 question the first first question from 00:40:56.880 --> 00:41:02.359 the internet the internet is saying you 00:40:59.760 --> 00:41:03.400 actually got hacked or can you elaborate 00:41:02.359 --> 00:41:05.599 on what 00:41:03.400 --> 00:41:07.119 happened Yes actually there was an 00:41:05.599 --> 00:41:08.680 incident where someone was able to post 00:41:07.119 --> 00:41:11.119 stuff to my blog and because I had a 00:41:08.680 --> 00:41:14.640 pend only data storage I Shrugged it off 00:41:11.119 --> 00:41:16.520 basically so use use a pendon data 00:41:14.640 --> 00:41:19.480 storage it's it will save your ass at 00:41:16.520 --> 00:41:22.079 some point the problem was a bug in my 00:41:19.480 --> 00:41:23.960 uh Access Control lists I had used some 00:41:22.079 --> 00:41:26.440 some Access Control list in my alab 00:41:23.960 --> 00:41:27.880 server and I had a line in it that I 00:41:26.440 --> 00:41:29.760 should have removed but I forgot to 00:41:27.880 --> 00:41:33.200 remove it and that meant you could post 00:41:29.760 --> 00:41:35.200 without having credentials but um it 00:41:33.200 --> 00:41:38.040 happened and it wasn't bad because my 00:41:35.200 --> 00:41:39.599 architecture prevented damage um as 00:41:38.040 --> 00:41:42.440 people are leaving the room could you 00:41:39.599 --> 00:41:44.760 leave very quietly thank you um 00:41:42.440 --> 00:41:47.119 microphone number one yeah is there a 00:41:44.760 --> 00:41:50.520 second alternative for Windows and Mac 00:41:47.119 --> 00:41:52.720 OS a secure alternative well so 00:41:50.520 --> 00:41:56.359 basically you can do the the principles 00:41:52.720 --> 00:42:00.000 I um I showed in this talk you can do on 00:41:56.359 --> 00:42:02.560 those two so usually you will not be 00:42:00.000 --> 00:42:05.359 hacked because your your Mac OS or 00:42:02.560 --> 00:42:07.079 Windows had a bug I that happens too but 00:42:05.359 --> 00:42:09.319 the bigger problem is that the software 00:42:07.079 --> 00:42:11.800 you wrote had a bug or that you the 00:42:09.319 --> 00:42:14.480 software that you use had a bug so I'm 00:42:11.800 --> 00:42:16.560 I'm trying to tell you Linux isn't uh 00:42:14.480 --> 00:42:18.520 particularly more secure than Windows 00:42:16.560 --> 00:42:20.599 it's just it's basically you can write 00:42:18.520 --> 00:42:22.839 secure software and insecure software on 00:42:20.599 --> 00:42:25.160 any operating system you should still 00:42:22.839 --> 00:42:26.720 use Linux because it has advantages but 00:42:25.160 --> 00:42:28.880 if you apply these Tech techniques to 00:42:26.720 --> 00:42:31.720 your software it will be secure on on 00:42:28.880 --> 00:42:34.480 Mac OS and windows as well right so this 00:42:31.720 --> 00:42:36.040 is not for for end users selecting the 00:42:34.480 --> 00:42:37.319 software if you select software you have 00:42:36.040 --> 00:42:39.520 to trust the 00:42:37.319 --> 00:42:42.200 vendor there's no way around that but if 00:42:39.520 --> 00:42:44.280 you write your own software then you can 00:42:42.200 --> 00:42:46.960 reduce the risk to a point where you can 00:42:44.280 --> 00:42:49.119 live with it and sleep soundly sure is 00:42:46.960 --> 00:42:51.359 there a a technical alternative or 00:42:49.119 --> 00:42:53.119 similar similarity like sa comp for 00:42:51.359 --> 00:42:54.760 Windows and Mac OS so can you drop your 00:42:53.119 --> 00:42:57.960 privileges after you have opened a file 00:42:54.760 --> 00:42:59.960 for example uh uh so for meos I'm not 00:42:57.960 --> 00:43:02.680 sure but I know that that free BSD net 00:42:59.960 --> 00:43:05.440 BSD and open BSD have an an equivalent 00:43:02.680 --> 00:43:08.119 thing I think uh Macos has it too but 00:43:05.440 --> 00:43:09.920 I'm I'm not sure about that for Windows 00:43:08.119 --> 00:43:11.559 there's are sandboxing methods you can 00:43:09.920 --> 00:43:13.359 look at the Chrome source code for 00:43:11.559 --> 00:43:16.440 example they have a Sandbox it's open 00:43:13.359 --> 00:43:18.960 source you can use that to do this kind 00:43:16.440 --> 00:43:21.720 of thing okay thanks so microphone 00:43:18.960 --> 00:43:23.800 number two except down that's gone so 00:43:21.720 --> 00:43:27.160 microphone number three in that 00:43:23.800 --> 00:43:29.480 case this is four I sorry four four yes 00:43:27.160 --> 00:43:31.720 um will your next talk be about writing 00:43:29.480 --> 00:43:33.559 software secure software in Windows and 00:43:31.720 --> 00:43:35.559 if no uh how much assets would you 00:43:33.559 --> 00:43:38.119 request to compensate for all the 00:43:35.559 --> 00:43:41.839 pain 00:43:38.119 --> 00:43:45.960 no it's not a question of 00:43:41.839 --> 00:43:48.359 money okay uh microphone one um have you 00:43:45.960 --> 00:43:49.440 tried removing unnecessary features from 00:43:48.359 --> 00:43:52.240 open 00:43:49.440 --> 00:43:54.680 SSL uh Yes actually I've I've done this 00:43:52.240 --> 00:43:56.680 pretty pretty early but it's still it's 00:43:54.680 --> 00:44:00.000 still much bigger than my code 00:43:56.680 --> 00:44:03.440 so um for example op SSL has support for 00:44:00.000 --> 00:44:05.119 UDP based TLs but there's a lot of 00:44:03.440 --> 00:44:06.960 shared cyers in there you can remove 00:44:05.119 --> 00:44:08.720 ciphers you don't need and and that 00:44:06.960 --> 00:44:11.880 helps a bit but it's still it's the 00:44:08.720 --> 00:44:14.720 biggest part of the web server by far I 00:44:11.880 --> 00:44:18.200 think there was an internet question was 00:44:14.720 --> 00:44:21.640 there no doesn't look like 00:44:18.200 --> 00:44:22.839 yes no yes no no yes okay uh then 00:44:21.640 --> 00:44:27.200 microphone 00:44:22.839 --> 00:44:29.640 four as someone who is uh connected or 00:44:27.200 --> 00:44:31.880 was connected to an industry which has 00:44:29.640 --> 00:44:34.200 programming programmable 00:44:31.880 --> 00:44:37.960 brakes 00:44:34.200 --> 00:44:39.480 um what is your opinion about things 00:44:37.960 --> 00:44:42.440 like 00:44:39.480 --> 00:44:44.079 mizra well well so there are standards 00:44:42.440 --> 00:44:45.240 in the automotive industry for example 00:44:44.079 --> 00:44:48.040 like misra 00:44:45.240 --> 00:44:50.359 to make sure you write better code and 00:44:48.040 --> 00:44:52.520 it's mostly compliance so they give you 00:44:50.359 --> 00:44:55.280 rules like um you shouldn't use 00:44:52.520 --> 00:44:56.960 recursion in your code for example and 00:44:55.280 --> 00:44:59.000 the functions should would be this big 00:44:56.960 --> 00:45:01.640 at at most and this is more I mean it 00:44:59.000 --> 00:45:03.440 will probably help a bit but it's much 00:45:01.640 --> 00:45:05.800 better to to invest in in good 00:45:03.440 --> 00:45:09.440 architecture but you may have noticed I 00:45:05.800 --> 00:45:11.200 I've said I wrote the code in C and I 00:45:09.440 --> 00:45:13.800 said nothing about what I did to make 00:45:11.200 --> 00:45:15.880 sure it's it's good code so that's 00:45:13.800 --> 00:45:17.559 that's a different dimension that's 00:45:15.880 --> 00:45:20.800 orthogonal right 00:45:17.559 --> 00:45:22.280 so follow those standards it will it 00:45:20.800 --> 00:45:25.040 will make your code a bit better 00:45:22.280 --> 00:45:26.640 probably um but it won't solve all the 00:45:25.040 --> 00:45:29.040 problems and I think personally you 00:45:26.640 --> 00:45:30.760 should do both you should make sure or 00:45:29.040 --> 00:45:32.520 try to make sure that there's as little 00:45:30.760 --> 00:45:34.160 bugs as possible in your code there's 00:45:32.520 --> 00:45:36.079 ways to do that I had to talk about that 00:45:34.160 --> 00:45:37.760 too but after you do that you should 00:45:36.079 --> 00:45:40.200 still have these kind of 00:45:37.760 --> 00:45:41.720 architectural guide guard rails that 00:45:40.200 --> 00:45:44.079 keep you on track even if someone 00:45:41.720 --> 00:45:46.240 manages to take over the 00:45:44.079 --> 00:45:47.280 process so now I think there was an 00:45:46.240 --> 00:45:50.599 internet 00:45:47.280 --> 00:45:53.520 question yes uh the internet is asking 00:45:50.599 --> 00:45:55.559 how would it work to like scale This 00:45:53.520 --> 00:45:58.839 truly impressive security architecture 00:45:55.559 --> 00:46:01.400 up for more use cases and more like 00:45:58.839 --> 00:46:04.880 larger theme or would the theme size and 00:46:01.400 --> 00:46:09.040 the feature keep ruin it yes 00:46:04.880 --> 00:46:09.040 so oh no oh 00:46:09.070 --> 00:46:15.839 [Laughter] 00:46:12.319 --> 00:46:15.839 no well I'm 00:46:24.800 --> 00:46:27.800 sorry 00:46:28.470 --> 00:46:36.780 [Music] 00:46:37.760 --> 00:46:40.760 la