Skip to content
AppSec PodcastThe Application Security Podcast — home
36 min

Niels Tanis — 3rd Party Risk in a .NET World

With Niels Tanis

Software Supply ChainCloud and Infrastructure

How much behavior do you inherit when you add one library to a . NET application?

Listen

Audio hosted by Buzzsprout. Nothing loads until you press play.

Episode chapters · 11 chapters
  1. 00:00IntroductionAudio
  2. 03:03What third-party risk really includesAudio
  3. 06:25Compromised dependencies and event-streamAudio
  4. 11:08Operation ShadowHammer and trusted updatesAudio
  5. 14:04Dependency risk in the .NET ecosystemAudio

About this episode

How much behavior do you inherit when you add one library to a .NET application? Niels Tanis joins Chris and Robert to examine third-party risk beyond checking a dependency for known vulnerabilities. They revisit the event-stream compromise and Operation ShadowHammer, then look at NuGet packages, transitive dependencies, and functionality developers may never intend to use. A PDF library becomes a concrete example of why network access and other capabilities deserve scrutiny. Niels explores isolation, assembly loading, and constraining library behavior rather than trusting every dependency with the application’s full privileges. He also describes using Mono.Cecil and his Fennec tooling to inspect calls, helping developers ask better questions about what their dependencies can actually do.

The Application Security Podcast is brought to you by Security Journey.

About Security Journey
Security Journey provides application security education for developers and everyone in the software development lifecycle.
Learn more about Security Journey

Connect with Niels Tanis:
LinkedIn
Niels’s blog

Resources
NuGet
iTextSharp
Operation ShadowHammer
Mono.Cecil
Fennec.CLI

Actionable

From this conversation

  1. Assess the maintenance of every dependency

    Always question like, what— how active are they fixing security issues

    3:17
  2. Update third-party libraries

    We always need to make sure that we're updating those libraries to latest versions.

    4:41
  3. Account for transitive dependency risk

    You usually have a dependency graph

    6:39
  4. Isolate components with least privilege

    The best way would be to have microservices, let's say Docker containers, least privilege.

    21:51
  5. Use layered controls to reduce dependency risk

    You should not rely on a single thing in order to do risk reduction.

    27:50
Transcript · 36 min conversation

0:00Chris RomeoNiels Tannus has a background in .NET development, pentesting, and security consultancy. He has experience breaking, defending, and building secure applications. Niels joins us to continue our .NET conversation from last year. This time around, we focus on the third-party risk we pull into our applications by using third-party libraries in a .NET world. We hope you enjoy this conversation with Niels Tannus. At Security Journey, we believe security is every developer's job. We work with our customers to help them build long-term, sustainable security culture amongst all their developers. Our approach is to provide security education that's conversational, quick, hands-on, and fun. We don't do lectures. Instead, we let the experts talk about what's important. Modules are quick, 10 to 20 minutes in length. We believe in hands-on experiments, builder and breaker style, that allow your developers to put what they learned into action. And And lastly, fun. Training doesn't have to be boring. We make it engaging and fun for the developers. Visit www.securityjourney.com to sign up for a free trial of the Security Dojo.

1:09Robert HurlbutHey folks, welcome to this episode of the Application Security Podcast. We are joined this time by a guest who's been with us before in the past. But first, I'm Chris Romeo, CEO of Security Journey, co-host of said podcast, also joined by Robert Hurlbut.

1:36Chris RomeoHey, Robert.

1:36Niels TanisHey, Chris. Yes, it's Robert, and Threat Modeling Architect.

1:40Chris RomeoGood to be here.

1:40Robert HurlbutAnd someone who knows something about .NET, from what I understand.

1:44Niels TanisA number of years I've spent in .NET code. Absolutely, yes.

1:49Robert HurlbutWell, you've, uh, you run a user group too, right?

1:52Niels TanisI do actually, celebrating 15 years running it.

1:55Robert Hurlbut15 years. Just say the name of the user group so everybody knows.

1:59Niels TanisBoston .NET Architecture Group.

2:01Robert HurlbutThat's awesome, man, to think about something that's been going for 15 years and you've been continuing to do that. So we're joined by Niels Tannes, and Niels was with us in Season 4 initially talking about a slice of the razor with ASP.NET Core, and he's back today to talk with us about third-party risk in a .NET context. Niels, welcome back to the show.

2:25Niels TanisThanks for having me, Chris and Robert. It would be a good idea, Robert, maybe that in the future I would pay a visit to that .NET user group if it has been around for that long, because I'm like a frequent visitor because one of our offices is in that same area. I know we tried it already in the past to meet up. Definitely, we'd love to have you come over. We should definitely do that.

2:47Robert HurlbutIt's locked in now. It's not on tape.

2:49Niels TanisThat's the reason.

2:50Robert HurlbutIt's been recorded in digital bits now and there's takebacks now, Niels, so you're locked in. So, Robert, you need him for January, just lock him on the schedule there. So, there you go.

2:59Niels TanisI will be over in March, April, and May, I believe. So, there's like 3 options in a row.

3:03Robert HurlbutThere you go. We just made a connection here. Well, let's talk about third-party risk. And so, Niels, I thought it'd be a good place to start would be to say, you know, what is the risk introduced with third-party libraries kind of at a high level? Let's set the stage for people.

3:17Niels TanisSo, um, if we start developing software, if it's, let's say, .NET or any other, let's say, language like Node or Java, then most of our apps will be consisting of packages that we get from some kind of repository that's on the internet. Nice thing about that is that having those libraries available allow us, like, as developers to become far much more productive by having already functionality that's in. I think the flip side, then moving to the application security space, is that With pulling in libraries, you have— the application will of course become larger, has more functionality. And most of those open source projects or products are being maintained by people even in their spare time. And then from security perspective, I would say like, hey, always question like, what— how active are they fixing security issues if something has occurred in a kind of a library? you're relying on that, right? For the same reason that you're like being more productive from using that library, you also extend the risks that you're facing by all the security things that are inside.

4:30Robert HurlbutYeah, and I've seen stats that say anywhere from 70% to 90% of code in an average application is coming— is not being written by that developer, it's being pulled in from libraries and dependencies.

4:41Niels TanisNo, and like, so my employer, we produce a report each year, and the one of last year indicates that from every .NET application that we've seen, almost 86% have at least one security issue in the libraries that they use at that point in time, which is quite, let's say, that's the baseline that we saw. It's pretty significant. Keep in mind that, of course, then you should say security issues, if we have a library and that's a third-party library, we always need to make sure that we're updating those libraries to latest versions. As I said, like, we need to keep an eye on, like, what are the projects doing themselves in order to fix those issues. And, and that, that, that's, that's a necessity, right? Otherwise, yeah.

5:24Robert HurlbutI mean, we can't say that enough, right?

5:27Chris RomeoWe're gonna—

5:27Robert Hurlbutwe're probably gonna say that 100 times during this interview and it won't be enough. Update your third-party libraries. Like, that— like, if, if you're gonna hang up the episode, now would be like after I say that. Update your third-party libraries.

5:38Niels TanisI think it's good if people at least take that away. For sure.

5:41Robert HurlbutYeah, I mean, there's a lot of other important things that we have to talk about, but really that's the core when I think about this whole third-party risk problem and the challenges that we're seeing and the vulnerabilities that are being pulled forward into production applications. And they continuously are being built with those vulnerabilities inside of them because people aren't using the tooling and stuff to be able to detect it.

6:02Niels TanisExactly. And they've got no clue which version, for example, is being used in production and a server, resulting in, like, if you go on the internet and search for some of the biggest data breaches, you will find that a lot of them are still due to the fact that there was an unpatched library used inside that application itself, right? So, it's a big problem. And yeah, that's step one.

6:25Robert HurlbutI've heard you say some or share some interesting kind of examples before. So, what are some of the examples of things that have gone terribly wrong from a third-party vulnerability/dependency perspective?

6:39Niels TanisYeah, so in the US, of course, we've got the Equifax breach that was due to some Struts library that wasn't updated. And I think it was a small time window in which the patch was being done and the hack took place. And that eventually resulted in, let's say, I think about 140 million records being stolen. So that's quite a lot. And that's an instance. And the other thing, like, be aware, like, we've got issues that there are vulnerabilities inside of libraries that you don't update. But the libraries themselves are also part of a, let's say, process of software, right? It's being written by a team, and hopefully they got some automation and some some stuff in place that will build the stuff for them. Aside from those vulnerabilities, you also have a supply chain involved. I would like to take that because that was the thing that I was moving towards, which means that because that library is being built and being maintained by somebody, there's a supply chain tied to that. That's people involved that builds the code, that probably releases, and with the DevOps movement nowadays, it's hopefully a lot of automation. You want to be as lazy as possible as a developer to get the maximum results. That will be the thing. But by having those third-party libraries inside your application, you extend your own supply chain with that one, meaning that the risk that you indirectly get is also the risk from that build pipeline. If the build pipeline is compromised, so not maybe necessarily a security issue, that's occurred in some of the dependencies or some of the transitive dependencies. So that's the second, let's say, step of library you need. If you have an app, then you usually have a dependency graph where you see like, hey, this is a package that I pull in, but underneath there might be even a lot more packages that the thing depends on, which you pull in. And every of those packages have got a supply chain between quotes, If one of those supply chains is being hacked or being compromised for some specific reason, then your own application is compromised. That's the indirect results of that. I think that aside from having vulnerabilities is one of the other biggest issues that we have seen. A good example would be one that has occurred with the npm package called EventStream, and that was November 2018. And there was a package called— it was called Event Stream, and it was like it had statistics. It would be downloaded, I think, 2 million times a week. And for some reason, somebody injected some code which had malicious intent. So that's an example of a supply chain that got compromised, and somebody who had other motives put in some code. Eventually, I think it was targeting some specific Bitcoin wallets to steal crypto from, from those wallets. And that was in. And also the biggest problem that the library had itself is that it was not that widely used, but it was a transitive library, meaning that it was a dependency of other libraries. And that was like 2,000 other libraries that will point into that single thing. And the project went stale. I believe that's the story, meaning that there was not much active development in, and somebody jumped in. saying like, hey, I'm here, I want to help out the community, and did some stuff on the library itself, and then eventually turned out to do other stuff and had— do different things and had other intentions, which is, which is, yeah, of course a bad thing and something that you probably don't think about if you're looking at libraries in general, right? That that's also a risk that you're facing. You're putting a lot of trust.

10:33Robert HurlbutIt's such a hard problem though, right? I mean, because when you're talking about a dependency of a component that you use primarily, I mean, that's pretty deep as far as you're not even thinking about that in your high-level kind of configuration file that's pulling in components. It's being pulled in by one of those components' dependencies, and there could be a chain of dependencies where 5 levels down the street, right, there's a vulnerable component being brought in to satisfy the dependency of component 4 that was called from 3, called from 2, from your original one that you put in your config file.

11:08Niels TanisThen all the build pipelines end up being a cascading problem for your own one. That's something at least to consider and to be aware of. I think another good example would be like, okay, so there are some things like in the way that we develop software and deploy software that should maybe give us some guarantees that we're still on the right track when we're doing, let's say, deployments and installation of software. Another good example was something that happened in March 2019, so March of this year, with ASUS. The supply chain of one of their updating tools got compromised, and that meant that somebody put in some, let's say, malicious code, and that software was used and installed on every device that was sold by ASUS, I believe. And there was some, let's say, I think command and control. There was some malware stuff inside of it. But the problem lied in the fact that it was due to that build supply chain that was compromised, and the package was completely signed in the normal way that ASUS would do it. So it's even hard for— like, even harder, I think, compared to, let's say, the previous example I gave, for an end user to determine, like, hey, am I downloading the right stuff or not? Because it ticked all the boxes from that perspective. Turned out that I believe there was some restriction on hardware that was targeted. Some guys from Kaspersky did a write-up of this attack called ShadowHammer. firmware, and there was a specific set of hardware addresses that were targeted in this case. So you could question yourself, like, hey, what did happen? But it was a quite sophisticated attack. And in that case, the only thing that you could do in that specific situation is look at some of the internals of that, in this case, package or executable that was used to do the updating. But if you look at your own software development, I think that's the same thing. So if you have a package that you get from a trusted repo, then you still, I think, are obligated to have at least some sense of what you would expect that library to do and what are its internals, like what's inside. That was the only way that Kaspersky was able to flag this and to write about this, which is, to one side, it's scary if stuff happens. But yeah, I think that's from our software development practice, Like, and it's even separate to the technology that you're using. I think we can do a better job also as a development community in general by being more sensible about libraries and about stuff that you're using. I think an npm thing, I think, happened a couple of months ago. I still need to look into those details. It was a similar situation, like somebody added some malicious functionality, and then somebody else in the community triggered it immediately. which allowed it to be removed quickly. But I think it's a real problem. And that's something that people should be aware of when you're writing software that rely on third-party dependencies.

14:04Robert HurlbutYeah, definitely. And so, what I want to do now is I want to switch back and kind of go into the .NET context specifically. And so, I'm not going to assume that everyone who's listening here understands the .NET ecosystem for dependencies and packages and things. And I'm not even super familiar with .NET from that perspective.

14:23Chris RomeoAnd so, As a developer, how do I get packages?

14:29Robert HurlbutHow do I choose components, dependencies, and things in a .NET world?

14:33Niels TanisWith the introduction of .NET Core, that has, like say, the way that you need to deal with dependencies has changed. .NET Core is a much more, let's say, separated in smaller components that will be fetched from a repo, which most of the times will be Microsoft's NuGet at the moment when you're needing it. If you, let's say, for example, look at .NET Core, it's got a pretty powerful CLI, and if you start out a new project, the first thing it will then do, if packages are not downloaded in some cache folder, it will fetch those dependencies from NuGet itself. That's the central server, and add it to your project. Let's say for a .NET Core app, there's a meta package that has an ASP.NET Core .all or .app package depending on which version you are on, and that will have a whole graph of dependencies that it will then pull in for that app. From that point on, you can continue on your development. You're fully relying on the fact that those dependencies are there compared to, let's say, how it previously was with .NET Full Framework. You usually needed to install the whole thing itself on your system. That was the first step. And then start your development from that perspective, or maybe have some other third-party libraries installed if you want to do some fancy stuff. But I think that's the difference. It's more relying on a package manager. It gives more flexibility, gives more power to the developer to become more productive. Because let's say if you want to do some PDF manipulation, it will be relatively easy to just say like, hey, there's an IPDFSharp library I'm aware of, let's get that one from NuGet by just adding a package reference in the CLI, and then you're good to go. If you then look into the dependencies and if you then even look into the transitive ones, you see like, hey, aside from the PDF, I'm also pulling in stuff that's related to crypto, which is called Bounty Console. There's a lot more that will be included from that point on. I think that's the biggest key you need to be aware of when you're developing, and if you're developing on a system that's relying on a package manager which will probably be equivalent for if you're doing Node.js, like other type of languages that will first do that if you start out a new project that will have a templating tool that will pull in all the stuff you need in order to be able to develop, right?

17:03Robert HurlbutOkay. And now, if let's say I'm someone who is coding in Node, Ruby, some other web-specific language, Is there anything different about .NET from a third-party risk? Is there anything that .NET specifically enables, or is third-party risk pretty generic across all the different types of languages that I could be coding in?

17:26Niels TanisI think conceptually, there's a lot of overlap and it's probably the same. Because I'm most familiar with .NET, I'm going to pull an example in from that context. I think there's a key difference between a framework that you pull in as a third-party library that you build your application on top of, or a library which is an isolated component that you pull in that you then use in order to, let's say, execute something for you. Let's do a PDF generation, then that's usually not a framework, that's usually a library that you just instantiate at some point in your codebase, or that you add to your dependency injection container so it's available throughout your whole application. Once that's available, you can just call it and use it. Compared to, let's say, a framework which is MVC, ASP.NET Core MVC is an example, and there are others, of course, available that will have more highly integrated codebase, let's say, that will be more tightly coupled with the software that you're writing because you're writing your things on top of it. For that library approach that I talked about earlier, the PDF one, I think it's like there are concepts within .NET that allow you to isolate the way that the code is being executed. There are ways you can have some assembly loading done in a separate context, assembly load context, and from that perspective, With .NET Framework in the past, there was a concept called app domains. That to some degree allows you to have more control over what's being loaded at some point in the app. But I think the other approach would be even more generic and would be maybe to isolate on a different level. Meaning that why— I think that's the key difference between, let's say, if you're developing a microservices app, that has more smaller components that do parts of the whole application that will have its own purpose. A microservice is responsible for doing customer data. There might be a microservice that does that PDF generation, for example. Why should there be a tight coupling between the customer data and the PDF generation? You want to isolate that and then maybe approach it from more architectural level and have more isolation in that. And that's, I think, agnostic to any language or any, let's say, development environment. Similar counts for if you're doing containers like Docker, Kubernetes, the whole movement in the cloud-native space. Then you would, like, you're almost forced on putting yourself into that space by having smaller compartments of logic that will be executed, and with also the key benefit of having it more scalable. So if there is a heavy load on, let's say, PDF generation, then why not spin up a second instance that can do it? But it gives you more granular control over what the components are doing inside your application architecture. I think that's agnostic. also for all the technologies that we develop our software in. And even if we're doing microservices or a bigger system, then I think the odds are really high that that probably consists of multiple technologies being used nowadays. It's not that it's being developed by, or that has changed, at least the stuff that I've seen. It's not that it's all written in .NET. No, it's you can use the technology that fits the needs.

21:12Robert HurlbutMm-hmm.

21:13Niels Tanisbest at that point, right? And then focus on that. I think that's quite powerful, and that's a good thing.

21:19Robert HurlbutLet me just make sure I understand. I'm going to just try to restate a little bit. So, when you're talking about from kind of an isolation compartmentalization perspective, you're talking about specifically taking something that could be potentially a vulnerable piece of the code and separating it into a microservice or even a separate application if you weren't as fancy as to have microservices, but you're effectively breaking it apart from the core application that has access to the customer database.

21:51Niels TanisYeah, you're reducing the risk. That's probably something that Robert can emphasize on from a threat modeling perspective, but I think there are different ways that we can isolate the stuff that we do and have more consensus of the risks that we're facing. To get back on my Build talk I gave and just to give that .NET example again, so there are things that we can do in code in order to improve, but I think the best way would be to have microservices, let's say Docker containers, least privilege. Why does that PDF service need to have access directly to some specific resources? That's usually not needed for the system to function because If there is a customer database that stores data and then some report gets generated, then a queue will have a message inside of it that will allow that report to be generated asynchronously, as a separate step. I think that's already the things that allow you to have more control. That's, of course, the difference between writing monoliths, big applications that contain it all, As I started out my development career myself, writing stuff, then cutting it up, creating web services as a backend, that's implicitly already cutting off the application into smaller pieces. I think from architecture perspective, we should always focus on that and make sure that we cover the risks in the best way possible. I think on top of that, there are some development practices like within the .NET space that we can do in order to do a better job. So I'm not sure, maybe you just recap what I was saying. I think I repeated myself a bit. It's all right. But I think that's a good thing if we can isolate and if we can compartmentalize the things that we're doing.

23:48Robert HurlbutSo is it possible to compartmentalize inside of a monolith? style application where you have things that are bigger? Is there like a code construct in .NET, or is it really microservices is the only answer?

24:00Niels TanisSo, what I created for my presentation I gave at Build earlier this year was a concept where we take an assembly load context that allows you to have more control on what base types are available on that library. And let me just quickly illustrate like what what the application was doing that I was using. So I was using that PDF library that I talked about earlier called IPDFSharp, and at some point you're allowed to get image data into your PDF because that's usually what you want to do. Maybe some text, some images that gets loaded, and that's being put in. Turned out that the library itself does web requests if you just pass it on a URL. The demo app I just gave has has the ability to put in files, upload files, and use those. But if you just put in a URL, then that library would take a web client and download that image from the internet. And if we look at some of the breaches that I think have occurred recently, even the one that was, I think, with Capital One, there's a concept called server-side request forgery, meaning that if the attacker has the ability to control a request that's done in the context of the app, he can do requests to other resources and maybe pull out information that he's normally not allowed to see. I think with Capital One, it was even— they were allowed to get some S3 bucket access key and from that use it and to get some data out of it and exfiltrate some customer data out of the system. So The fact that the PDF library in my demo app was allowed to do web requests is something that you would maybe want to do some more isolation on. If you then move to— I'm going to do just one analogy of the stuff that I said before. If you have a Docker container that does some egress traffic, so that does requests to the outside, well, you can probably restrict it. The thing that I've shown with my .NET example is that I can also pull out the web client out of my .NET Core framework in that specific area of the app, and then say, hey, you're not allowed to do any HTTP requests to the outside world because I think the library itself should not be able to do that. That's a bit of, let's say, common sense. I'm expecting a library to generate a PDF for me, I might give it some text, I might give it some file stream or some bytes in order to— let's say this is an image that you need to display inside of page number 1. But I don't expect it to do requests on its own to external resources because that faces a security risk, and that's exactly what happens. There are definitely areas that we can improve in that particular thing. in code, and that's the thing that I've shown. The code is available on GitHub if people search for my presentation and you can see it if they're technically interested in seeing what I'm doing. But that gives you more control. In the early days from .NET, we had a concept called app domains, which was even locked down with something called Code Access Security, and I think Robert might be able to recall this one.

27:23Chris RomeoYeah.

27:24Niels Tanisthat allows you to be more restrictive. I think the biggest example we have seen in that was medium trust levels in ASP.NET. In a shared hosting environment, that would make sense because if you then would be on an app and if there was full trust on the .NET Framework, it would mean that if your app was running on that server, you could access all the temp files of all the other apps also because that wasn't locked down.

27:50Robert HurlbutYeah.

27:50Niels TanisBut at some point, Microsoft decided to say, like, app domains is not a security boundary. It's not something that's that restrictive. You can even turn off code access security in a process that's running on your own by just setting some mutex that's available in user space memory. So it's pretty straightforward. So that was not a good approach. So would I say code approach and architectural approach, what's the best? should always be a layered approach, right? You should not rely on a single thing in order to do risk reduction. You want to have different layers, I think, in order to do a better job. And that will be in code depending on the technology that you're doing, and also in the way that it's deployed on that container that runs on a Kubernetes cluster in some kind of cloud environment, right?

28:42Robert HurlbutYeah, it's fascinating that you've taken the approach of being able to kind of constrain what a library is able to do in code. Because that's one of the things that I always share with people at a high level, but I don't always have a great idea of how to actually do it in the language that they're working in. But, you know, when we're thinking about using dependencies, like, you look at how much of a dependency's code actually you'd actually need. A lot of times you pull in a library for one function, And you pulled in 50,000 lines of code for the 50 lines of code that you actually need. And so, we definitely need better ways to wrap around components. And I hate to use the word firewall the component, but it's effectively what you're doing here is you're neutering the component to keep it to only be able to do what you want it to be able to do.

29:30Niels TanisYeah. And you can still say, like, hey, maybe you should do a pull request on that component and then help out the project do a better job itself. there might be scenarios where people still want to use that functionality. If I'm developing such system, then as you said, I would like to have more controlled approaches, like almost doing micro patches on framework level and saying, hey, you're not allowed to do this. It's not even something that's decided at runtime. No, it's something that completely strips out that type. If that .NET code gets executed, it will just throw, an exception because the method, it's not— or the type is not available anymore, or it has been replaced with something else. And I think that that's a pretty powerful concept, even if you're running it inside of that already isolated container, right? So why not do that as a second layer?

30:21Robert HurlbutBring it all together. That's right. Well, the last part that we wanted to chat about here was you had mentioned the idea of getting better in reviewing libraries and APIs specifically for problems. And so, when you say that, are you talking about the kind of human element of code review or tools, or what are you talking about there?

30:42Niels TanisSo, I'm getting the analogy again from a developer perspective. You should always be lazy, and that's what I am. I would like to do as much as possible. So, what I've also tried to achieve is that I've written a small tool. That does a dump of API calls that's done inside of a library. It's a straightforward approach by just taking a library called Mono Cecil that allows you to decompile an app and it allows you to look into the libraries. Keep in mind that you always need to comply with licenses if you're using a third-party library, and it's not necessarily true that you're allowed to decompile it. But let's say you've checked all the licenses and you dig into a component, Then what my tool does, it dumps all the API calls and it's just a plain text file that you can easily compare by saying like, I got version A and version B, and then just compare 2 of those dump files and see like, hey, for some reason somebody added a call that includes binary formatter, which is like from .NET perspective, a lot of the root cause problems for any remote code execution. Binary formatter allows you to serialize instances and deserialize data, and if it's untrusted, then somebody might, like, do it with any arbitrary type and execute code on that server. So, I think if we have tools that allows you to do that reviewing much more quicker, then we can definitely get better and you can just like use it and to improve your own sense of that component. And it's, as I said, it's also like common sense, like what do I expect? And secondly, if you even put it into a bigger scope and like even a bigger space, then why not do it with a group of people and go over all the components that we're able to review and do the same and keep an eye on those things, right? And then maybe be able to proactively act on such a thing as we have talked about earlier, like, hey, some supply chain has been compromised, and if they target a package that's widely used, then, like, the impact can be big. So maybe we should do that to help out everybody to do a better job. So that's the other ideas I had also with that tool in mind, just to make sure that we're— like able to review libraries much easier and of course automate it and maybe integrate it into some build pipeline stuff that you're doing with Azure DevOps or GitLab or any other build system. It's, I think that's the thing that allows us to scale because as you probably both know is that application security in general is a tough problem, especially in larger organizations. to allow everybody to develop the software that they need and to allow them to use the things that they need, libraries. If it's something that really helps them out, then I think application security should not be a full stop for them. No, it should help them out in order to improve and make the right decisions. I think that that's the goal of the tool. And I would like to see more people use it. But, um, yeah, it's a start, and, uh, let's see how, how that will go in the future.

34:14Robert HurlbutSo, it comes down to providing live— or tools that the developers can use to make their lives easier in reviewing for potential security problems versus expecting them to do some type of a code review of the source code of a dependency.

34:30Niels TanisYeah, exactly. And that's always time-consuming, and I think it's not— it's It's both dev developers but also people that run application security for big organizations. So if you would like, there might still be a need to do a thorough review of something, but if you can cut off like the biggest risks at first and the risk is reduced already, then why make it such a hassle for somebody to move on and to develop, to continue on developing, right? That's the whole risk game that you then get involved in. But I think we can definitely improve giving them more metrics and better tools in order to make the right decisions.

35:04Robert HurlbutWell, Niels, thanks for sharing your perspective here on third-party risk and .NET and how this all comes together. And we look forward to having you back again in the future to talk about something else .NET-specific.

35:17Niels TanisOkay, thanks, Chris. Thanks, Robert, for your time. Thanks for having me.

35:21Chris RomeoThanks for listening to the Application Security Podcast. You'll find the show on Twitter @AppSecPodcast or on the web At www.securityjourney.com/application-security-podcast. You can also find Chris on Twitter @edgeroute and Robert @roberthurlbut. Remember, security is a journey, not a destination.

6,016 words · transcript by assemblyai

More on Cloud and Infrastructure

View all episodes →

Get Reasonable AppSec: new episodes and useful picks from the archive.