Skip to content

Great Minds Make Great Tech with Claude Morings Jr

It’s been an exciting month for us here at CloudM as we get set to officially launch our US subsidiary, CloudM Inc. With over 10 years of experience in the US market already, this natural evolution promises to deliver an even better customer experience for our amazing North American customers.

What better time to celebrate the staff that have supported our US market and made this next step possible. And, who better to speak to than US employee no.1 – Claude Morings Jr.

Hi Claude – Tell us a little bit about yourself?

Hey! I’m the Global Product Support Manager here at CloudM. I joined 4 years ago (this month to be exact) as CloudM’s very first US employee.

Wow! And now we have 13 US based employees and growing, with a US subsidiary being established. You must’ve seen some changes in the past 4 years

Absolutely. Personally, I’ve been able to grow the Support Team out from a solely UK based operation to a truly global department, with dedicated, knowledgeable staff located around the globe (including APAC), delivering true 24 / 7 support.

None of this was in place, and to have that set on my shoulders as a deliverable when accepting the role was a lot of pressure. But, it has created the amazing support team we have now, which I’m extremely proud of.

In the US, helping the business get the right people in place and seeing the business grow to generate the revenue to get here, establishing CloudM Inc., has been so rewarding. In the last year alone, the number of US based employees has skyrocketed and it’s only set to continue. That can only be good for our customers.

So, what do you enjoy about working at CloudM?

Firstly, my team. My favorite parts of the week are when someone within the team achieves a goal, receives good feedback, or puts a process in place that benefits them and their colleagues. I was given the opportunity to build the team and put people in those positions to showcase their talents so it feels like validation.

I really like how we make remote working work, even across multiple time zones and regions. It’s great to feel like one team with colleagues across APAC, Europe and North America (from sea to shining sea).

Saying that, getting the opportunity to meet up in person is amazing. I’m from a small town in North Carolina, and while I have traveled across the world during my 12 years in the Army, my family is amazed when I tell them I’m visiting the head office based in the UK or that I get to go to Spain for a company kickoff meeting.

What is your favorite CloudM value?

My favorite value is to appreciate others. I can crack on, try new things, and get involved, but showing others that they’re appreciated (and feeling appreciated) makes the other values easier to achieve.

Any advice for someone looking to join the CloudM team?

It will be challenging, but we will have fun and you will feel supported. At CloudM, you will only fail if you choose to. The team here is pretty good at circling the wagons around someone who needs extra assistance, sharing their own experiences and knowledge.

It’s a great time to get involved. The CloudM team, globally and in the US, is growing and there are so many opportunities for personal and career growth. If you are hard working, eager to learn and challenge yourself, CloudM is a great place to work.

About Version 2 Digital

Version 2 Digital is one of the most dynamic IT companies in Asia. The company distributes a wide range of IT products across various areas including cyber security, cloud, data protection, end points, infrastructures, system monitoring, storage, networking, business productivity and communication products.

Through an extensive network of channels, point of sales, resellers, and partnership companies, Version 2 offers quality products and services which are highly acclaimed in the market. Its customers cover a wide spectrum which include Global 1000 enterprises, regional listed companies, different vertical industries, public utilities, Government, a vast number of successful SMEs, and consumers in various Asian cities.

About CloudM
CloudM is an award-winning SaaS company whose humble beginnings in Manchester have grown into a global business in just a few short years.

Our team of tech-driven innovators have designed a SaaS data management platform for you to get the most from your digital workspace. Whether it’s Microsoft 365, Google Workspace or other SaaS applications, CloudM drives your business through a simple, easy-to-use interface, helping you to work smarter, not harder.

By automating time-consuming tasks like IT admin, onboarding & offboarding, archiving and migrations, the CloudM platform takes care of the day-to-day, allowing you to focus on the big picture.

With over 35,000 customers including the likes of Spotify, Netflix and Uber, our all-in-one platform is putting office life on auto-pilot, saving you time, stress and money.

23.3.4 ‘Voyager’ released

Changes compared to 23.3.3

New Features

  • Add the ability to search for items to restore within Storage Vault snapshots via the Comet Server web interface

Bug Fixes

  • Fix an issue with opening the Comet Server web interface for some admin accounts with restricted permissions
  • Fix an issue with pre-configuring backup options when clicking “Run backup” on a Protected Item in the Comet Server web interface
  • Fix an issue adding email addresses to user profiles in the Comet Server web interface
  • Fix an issue with incorrect Backblaze B2 storage validation
  • Fix an issue with validation on the Storage Role while the Storage Role is disabled
  • Fix a cosmetic issue with widgets on the About This Server page in the Comet Server web interface
  • Fix a cosmetic issue with widgets on the Comet Server web interface homepage disappearing on page reload

About Version 2 Digital

Version 2 Digital is one of the most dynamic IT companies in Asia. The company distributes a wide range of IT products across various areas including cyber security, cloud, data protection, end points, infrastructures, system monitoring, storage, networking, business productivity and communication products.

Through an extensive network of channels, point of sales, resellers, and partnership companies, Version 2 offers quality products and services which are highly acclaimed in the market. Its customers cover a wide spectrum which include Global 1000 enterprises, regional listed companies, different vertical industries, public utilities, Government, a vast number of successful SMEs, and consumers in various Asian cities.

About Comet
We are a team of dedicated professionals committed to developing reliable and secure backup solutions for MSP’s, Businesses and IT professionals. With over 10 years of experience in the industry, we understand the importance of having a reliable backup solution in place to protect your valuable data. That’s why we’ve developed a comprehensive suite of backup solutions that are easy to use, scalable and highly secure.

TOPIA’s new CVE Trend Screen is out!

With the new CVE Trend screen, you can see how your hard work is paying off much more. The new graph presents the aggregated amount of vulnerabilities TOPIA has detected and their trend over time. The screen includes three main components – actions that were taken in TOPIA, events that passively occurred in your deployment, and CVE actions. The purpose of this screen is to show the connection between the work that is being done by TOPIA and the overall vulnerability risk you are currently experiencing. You can also investigate the events, activity, and CVE events of different periods connected to those detected and mitigated events. #topia_updates #cve_trend_graph #efficiency

Tags

  • #vicarius_blog

  • #topia_updates

  • #cve_trend_graph

  • #efficiency

users/photos/clelsrr9efk2w0jmvf7ah22xb.png

Written by

Noa Machter

About Version 2 Digital

Version 2 Digital is one of the most dynamic IT companies in Asia. The company distributes a wide range of IT products across various areas including cyber security, cloud, data protection, end points, infrastructures, system monitoring, storage, networking, business productivity and communication products.

Through an extensive network of channels, point of sales, resellers, and partnership companies, Version 2 offers quality products and services which are highly acclaimed in the market. Its customers cover a wide spectrum which include Global 1000 enterprises, regional listed companies, different vertical industries, public utilities, Government, a vast number of successful SMEs, and consumers in various Asian cities.

About VRX
VRX is a consolidated vulnerability management platform that protects assets in real time. Its rich, integrated features efficiently pinpoint and remediate the largest risks to your cyber infrastructure. Resolve the most pressing threats with efficient automation features and precise contextual analysis.

CVE-2020-17519: Apache Flink Directory Traversal Vulnerability

Introduction

Directory Traversal in Apache Flink version 1.11.0, 1.11.1, and 1.11.2 has been found and registered as #CVE-2020-17519

What is Apache Flink?

#Apache #Flink is an #open-source, unified stream-processing and batch-processing framework developed by the Apache Software Foundation. The core of Apache Flink is a distributed streaming data-flow engine written in Java and Scala. Flink executes arbitrary dataflow programs in a data-parallel and pipelined manner.

https://www.shodan.io/search?query=flink+port%3A8081

Background Story

After I figured out how to debug Apache Flink and edit the configuration so I can debug it remotely which gives the huge advantage of following the request step by step. However I had to figure out where I want to set the breakpoints, I started reading through the code (I almost read everything :D), and from previous experience and reading the API doc I figured out to check the router class, and there I found 6 classes.

The classes are not directly related however one of them handles and process the incoming HTTP requests and routes them to the right handler also to build more of a clear idea I had to understand those 6 classes more in detail.

After that being said, I found that channelRead0 it’s an interesting method, so I added a breakpoint there, I sent the request that triggers the vulnerability, and I started to step-in the program.

After a lot of stepping-in, I found the implemented method that decodes the URL and gets the path from it, also I found the method that read the file and how it gets loaded.

Build the lab

Install the system and prerequisites

  • OS: Ubuntu Server 20.04

  • You will need to install maven

    • sudo apt update

    • sudo apt install default-jdk

    • Download it from the following link: https://dlcdn.apache.org/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz

    • sudo tar xf apache-maven-3.2.5-bin.tar.gz -C /opt

    • sudo ln -s /opt/apache-maven-3.2.5 /opt/maven

    • sudo vim /etc/profile.d/maven.sh

      • export JAVA_HOME=/usr/lib/jvm/default-java

      • export M2_HOME=/opt/maven

      • export MAVEN_HOME=/opt/maven

      • export PATH=${M2_HOME}/bin:${PATH}

    • sudo chmod +x /etc/profile.d/maven.sh

    • source /etc/profile.d/maven.sh

    • mvn -version

  • Install apache flink

Setup the debugger

  • Open flink-conf.yaml

  • Add the following:

    • env.java.opts: "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1337"

  • By that, the debugger will be able to connect to port 1337.

  • Now run the solution

    • ./build-target/bin/start-cluster.sh

  • You can check it in your browser

http://localhost:8081/#/overview

  • Now run the debugger in this file

Reproduce the vulnerability

Once it’s all installed and ready you should be able to easily reproduce the vulnerability by browsing the following link:

http://localhost:8081/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd

Static Analysis

Explaining the code

From reading the document and going through whatever information I can find about this CVE, I know this is happening in the REST API.

You can notice here that the endpoint “jobmanager/logs” is part of the REST API.

https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/ops/rest_api/

While you are reading in the doc, especially here, you can find that the REST API backend is in the flink-runtime.

From previous experience, for example, the analysis of Joomla CVE-2023–23752 (https://www.vicarius.io/vsociety/blog/cve-2023-23752-joomla-unauthorized-access-vulnerability)

I know that there is some routing function, and route handlers that handle and process the request.

Going through the folders and files and reading a lot of code, under flink-runtime/src/main/java/org.apache.flink.runtime, I found a folder named “rest” and I figured out it may be referring to rest API, and I found a handler folder there and there I found route

I started to read the codes in each file one by one.

MethodlessRouter

The MethodlessRouter class has the following components:

  • The routes map is a map of PathPattern objects to target objects.

  • The routes() method returns an unmodifiable map of all routes in the router.

  • The addRoute method adds a new route to the router by creating a new PathPattern object for the specified path pattern and adding it to the map of routes.

  • The removePathPattern method removes the route specified by the path pattern.

  • The route method takes a URI, a decoded path, a map of query parameters, and an array of path tokens as input, and returns a RouteResult object that contains the target object for the matched route, along with any path parameters and query parameters. It loops through the map of routes and checks if the path tokens match any of the PathPattern objects. If a match is found, the target object is returned along with any path parameters and query parameters.

  • The anyMatched method checks if there is any matching route for the given array of path tokens. It loops through the map of routes and checks if the path tokens match any of the PathPattern objects. If a match is found, it returns true.

  • The size method returns the number of routes in the router.

PathPattern

  • PathPattern which represents a pattern used to match a URL path. The class takes a path pattern as input in its constructor and creates a list of tokens from the pattern. The pattern can contain constants or placeholders, and if it exists, the placeholder with the format :* is a special placeholder to catch the rest of the path (may include slashes).

  • The class has two instance variables, pattern and tokens, both of which are final and set in the constructor. pattern is a string representing the pattern without slashes at both ends. tokens is an array of strings representing the pattern split by the / character, for example: constant1/constant2?foo=bar

  • PathPattern() constructor creates a new PathPattern object from a String pattern. It checks if the pattern contains a query, removes slashes from both ends of the pattern using removeSlashesAtBothEnds(), and splits the pattern into tokens.

  • removeSlashesAtBothEnds() This is a static utility method that removes slashes from both ends of a path. It takes a String path, checks if it is empty, finds the first non-slash character, finds the last non-slash character, and returns the substring between them.

  • Match()

    Params will be updated with params embedded in the request path.

    This method is designed so that requestPathTokens and params can be created only once then reused, to optimize for performance when a large number of path patterns need to be matched.

    Returns: false if not matched; in this case params should be reset

RoutedRequest.Java

This contains PathPattern and this is the same class as we explained it before and RoutedRequest class and this class is for handling HttpRequest with associated RouteResult.

Router

I will not go through the code for this, the doc explaining it in a very well way.

RouteResult

RouteResult is a class that represents the result of calling the Router#route(HttpMethod, String) method. It contains information about the matched route, such as the original request URI, the decoded request path, path parameters, and query parameters. It also holds a reference to the target that will handle the request.

  • The RouteResult class is defined with a generic type T which represents the target that will handle the request.

  • The RouteResult class has several instance variables:

    • uri: represents the original request URI.

    • decodedPath: represents the decoded request path.

    • pathParams: a map that contains all the path parameters embedded in the request path.

    • queryParams: a map that contains all the query parameters in the request URI.

    • target: the target that will handle the request.

  • The RouteResult class provides several methods to get the parameters from the path and query parameters:

    • queryParam(name): extracts the first matching parameter in the queryParams.

    • param(name): extracts the parameter in pathParams first, then falls back to the first matching parameter in queryParams.

    • params(name): extracts all parameters in pathParams and queryParams matching the name.

RouteHandler

RouterHandler class is an inbound handler that converts a HttpRequest to a RoutedRequest and passes the RoutedRequest to the matched handler. It also replaces the standard error response to be identical with those sent by the AbstractRestHandler.

  • ROUTER_HANDLER_NAME and ROUTED_HANDLER_NAME are constants used as names for the handler in the Netty pipeline.

  • LOG is a logger instance for logging debug or trace information about the handler.

  • responseHeaders is a map containing headers to be included in the HTTP response.

  • router is an instance of the Router class which is used to route incoming requests to their respective handlers.

  • The RouterHandler constructor takes a Router and a map of headers as parameters and initializes the router and responseHeaders fields accordingly.

  • getName() is a method that returns the name of the handler.

  • The RouterHandler class overrides the channelRead0 method, which is called by Netty whenever a new message is received on the channel. This method is responsible for routing incoming requests to their respective handlers and generating responses.

  • The overridden channelRead0 method first checks if the request expects 100-continue, and if so, sends a continue response and returns.

The HTTP 100 Continue informational status response code indicates that everything so far is OK and that the client should continue with the request or ignore it if it is already finished.

  • It then extracts the HTTP method and path from the request using httpRequest.getMethod() and httpRequest.uri(), respectively. It passes the method and path to the router.route method to obtain a RouteResult object, which contains the matched handler and any path or query parameters.

  • If the routeResult object is not null, the routed method is called to pass the request to the matched handler, otherwise, it will call respondNotFound and send Not Found response.

  • The routed method retrieves the handler from the routeResult object, and adds it to the Netty pipeline using pipeline.addAfter or pipeline.replace, depending on whether the handler was already added to the pipeline.

  • Finally, it creates a new RoutedRequest object using the routeResult and httpRequest, and passes it to the next channel handler in the pipeline using channelHandlerContext.fireChannelRead.

After we explained all the involved classes, you can understand why I thought RouterHandler is the most interesting one for me.

Debugging

Before we start the debugging, don’t forget to run the debugger you added before

Add a breakpoint here:

Now send the request, or just simply go to

http://localhost:8081/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd

instantly, you will see something like this, and you can notice the httpRequest with everything else related such as method, URI…etc.

Keep your eyes on the code and debugger.

Now step-in.

How does the URL get decoded and read as path

Once you reach to this line number 82 in RouterHandler.java

RouteResult<?> routeResult = router.route(method, qsd.path(), qsd.parameters());

Click the step-in button, and you will notice that route, path(), and parameter got highlighted.

Click on path()

This will lead you to QueryStringDecoder.class this method:

Now click step-in

Step in again and this will take you to decodeComponent method

This is basically a method that decodes a portion of a string that may contain URL-encoded characters.

    private static String decodeComponent(String s, int from, int toExcluded, Charset charset, boolean isPath) {

        int len = toExcluded - from;

        if (len <= 0) {

            return "";

        } else {

            int firstEscaped = -1;

            int decodedCapacity;

            for(int i = from; i < toExcluded; ++i) {

                decodedCapacity = s.charAt(i);

                if (decodedCapacity == 37 || decodedCapacity == 43 && !isPath) {

                    firstEscaped = i;

                    break;

                }

            }

            if (firstEscaped == -1) {

                return s.substring(from, toExcluded);

            } else {

                CharsetDecoder decoder = CharsetUtil.decoder(charset);

                decodedCapacity = (toExcluded - firstEscaped) / 3;

                ByteBuffer byteBuf = ByteBuffer.allocate(decodedCapacity);

                CharBuffer charBuf = CharBuffer.allocate(decodedCapacity);

                StringBuilder strBuf = new StringBuilder(len);

                strBuf.append(s, from, firstEscaped);

                for(int i = firstEscaped; i < toExcluded; ++i) {

                    char c = s.charAt(i);

                    if (c != '%') {

                        strBuf.append(c == '+' && !isPath ? ' ' : c);

                    } else {

                        byteBuf.clear();

                        do {

                            if (i + 3 > toExcluded) {

                                throw new IllegalArgumentException("unterminated escape sequence at index " + i + " of: " + s);

                            }

                            byteBuf.put(StringUtil.decodeHexByte(s, i + 1));

                            i += 3;

                        } while(i < toExcluded && s.charAt(i) == '%');

                        --i;

                        byteBuf.flip();

                        charBuf.clear();

                        CoderResult result = decoder.reset().decode(byteBuf, charBuf, true);

                        try {

                            if (!result.isUnderflow()) {

                                result.throwException();

                            }

                            result = decoder.flush(charBuf);

                            if (!result.isUnderflow()) {

                                result.throwException();

                            }

                        } catch (CharacterCodingException var16) {

                            throw new IllegalStateException(var16);

                        }

                        strBuf.append(charBuf.flip());

                    }

                }

                return strBuf.toString();

            }

        }

    }

The method takes the following variables a string s, a starting index from, an ending index toExcluded, a character set charset, and a boolean isPath.

private static String decodeComponent(String s, int from, int toExcluded, Charset charset, boolean isPath) {

The length of the portion of the string to decode is calculated as the difference between the ending index and the starting index. If the length is zero or negative, an empty string is returned. Otherwise, the decoding process begins.

int len = toExcluded - from;
if (len <= 0) {
    return "";
} else {

The firstEscaped variable is set to -1 to indicate that no URL-encoded characters have been found yet. The loop iterates over the portion of the string to decode and checks each character. If a character is either a percent sign (`%`) or a plus sign (`+`) and the isPath flag is false (indicating that the string is not a URL path), the firstEscaped variable is set to the index of the character and the loop breaks.

int firstEscaped = -1;

int decodedCapacity;
for(int i = from; i < toExcluded; ++i) {
    decodedCapacity = s.charAt(i);
    if (decodedCapacity == 37 || decodedCapacity == 43 && !isPath) {
        firstEscaped = i;
        break;
    }
}

If no URL-encoded characters were found, the entire portion of the string is returned unmodified using the substring method. Otherwise, the decoding process continues.

if (firstEscaped == -1) {
    return s.substring(from, toExcluded);
} else {
    ...
}
  • A CharsetDecoder object is created using the provided character set.

  • The decodedCapacity variable is set to the maximum number of bytes
    that could be required to represent the URL-encoded portion of the string in the given character set.

  • Byte and character buffers are allocated to hold the decoded data.

  • StringBuilder is created to accumulate the decoded characters.

  • Finally, strBuf.append(s, from, firstEscaped) that appends a substring of the original input string s to the StringBuilder object strBuf.

CharsetDecoder decoder = CharsetUtil.decoder(charset);
decodedCapacity = (toExcluded - firstEscaped) / 3;
ByteBuffer byteBuf = ByteBuffer.allocate(decodedCapacity);
CharBuffer charBuf = CharBuffer.allocate(decodedCapacity);
StringBuilder strBuf = new StringBuilder(len);
strBuf.append(s, from, firstEscaped);

The last part of the method decodes any URL-encoded characters found in the string and appends the resulting decoded characters to the StringBuilder that will be returned as the decoded string.

The loop starts at the index of the first URL-encoded character found earlier (`firstEscaped`) and iterates over each character in the remaining portion of the string to decode. If the character is not a percent sign (`%`), it is appended to the StringBuilder directly. If it is a percent sign, it indicates the start of a URL-encoded sequence, and the byte buffer is cleared.

The loop then reads the two hexadecimal digits that follow the percent sign in the input string, converts them to a byte value, and appends that byte to the byte buffer. This process continues until a non-percent character is found or the end of the string is reached. If the end of the string is reached before a terminating percent sign is found, an exception is thrown.

for(int i = firstEscaped; i < toExcluded; ++i) {
    char c = s.charAt(i);
    if (c != '%') {
        strBuf.append(c == '+' && !isPath ? ' ' : c);
    } else {
        byteBuf.clear();
        
        do {
            if (i + 3 > toExcluded) {
                throw new IllegalArgumentException("unterminated escape sequence at index " + i + " of: " + s);
            }

            byteBuf.put(StringUtil.decodeHexByte(s, i + 1));
            i += 3;
        } while(i < toExcluded && s.charAt(i) == '%');
        
        --i;
        byteBuf.flip();
        charBuf.clear();
        CoderResult result = decoder.reset().decode(byteBuf, charBuf, true);
        
        try {
            if (!result.isUnderflow()) {
                result.throwException();
            }
            
            result = decoder.flush(charBuf);
            if (!result.isUnderflow()) {
                result.throwException();

So in other words what happens is that it iterates through the URL or the path which you will see as a the value in variable s and It will decode it twice, once decode the double URL encoding, after that, it re-decodes it, so we have now the normal passwd path and that’s because it checks that there’s a character indicating that this is an URL-encoded value.

You can see here, it’s getting decoded from ..%252f to ..%2f

Watch the video here for more understanding:

https://youtu.be/j9-cP5JwY54

Once you get here

Hit another step-in, you suppose to get here (if not, just go to MethodlessRouter.java and add a breakpoint at line 94)

You will find yourself here:

You can see the pathParams variable it’s basically a filename and it maps to ../../../../../../../../../../../../etc/passwd

  • unmodifiableMap Returns an unmodifiable view of the specified map. This method allows modules to provide users with “read-only” access to internal maps. Query operations on the returned map “read through” to the specified map, and attempts to modify the returned map, whether direct or via its collection views, result in an UnsupportedOperationException.

    The returned map will be serializable if the specified map is serializable.

How is the file read and accessed

Keep following the debugger, you suppose to reach this line here:

This is amazing because the value of file is

/home/us1/Desktop/flink-release-1.11.0/flink-dist/target/flink-1.11.0-bin/flink-1.11.0/log/../../../../../../../../../../../../etc/passwd

Just to show you how this work, go to your terminal and cat this path, and it will cat the passwd file.

Keep stepping-in

You will start seeing information about the file in the debugger, such as the file length, the permissions (writable, readable, append), path, open or close ..etc.

The function that loads the file

Keep following the debugger, and you will reach this snippet of code:

and from here, another step-in, you will get to the method where it loads the file.

You can see here the filename and the passwd path.

and just for extra information, this will use File. java which creates a new File instance from a parent abstract pathname and a child pathname string.

Finally, you will notice that the content of passwd got sent to the browser

Mitigation

Any version after apache flink 1.11.2 is fixed.

Patch Diffing

We can see the changes here:

https://github.com/apache/flink/commit/b561010b0ee741543c3953306037f00d7a9f0801#diff-30c0c4f6e68367e426ab85ce42ff037bcb1ed50a27417e4e55bf4e17bc734c7d

So basically they made changes on JobManagerCustomLogHandler.java.

This line

String filename = handlerRequest.getPathParameter(LogFileNamePathParameter.class);

This will get only the name of the file, so if the attacker tried to achieve directory traversal the path won’t be the following as we saw it before

/home/us1/Desktop/flink-release-1.11.0/flink-dist/target/flink-1.11.0-bin/flink-1.11.0/log/../../../../../../../../../../../../etc/passwd

we would get passwd only as the file name as a result, the method would not be able to access the sensitive file outside the intended directory structure, and the attack would be prevented.

Final Thoughts

It’s not really that complicated vulnerability as a concept, all that happened is that a get file function getting injected with a specific path ../../../../etc/passwd and it’s very normal that it will follow this path and load the file.

However, what makes this breakdown complicated is that I’m trying to achieve what I like to call “deep understanding” and that’s because I’m VSOCIETY ELITE 1337 member 😈, but I like to understand what happened exactly, when, how, and why.

I would suggest you follow the debugging steps because it will make sense along with the code explanation.

The patch diffing was pretty much straightforward, I like patch diffing!

Resources:

About Version 2 Digital

Version 2 Digital is one of the most dynamic IT companies in Asia. The company distributes a wide range of IT products across various areas including cyber security, cloud, data protection, end points, infrastructures, system monitoring, storage, networking, business productivity and communication products.

Through an extensive network of channels, point of sales, resellers, and partnership companies, Version 2 offers quality products and services which are highly acclaimed in the market. Its customers cover a wide spectrum which include Global 1000 enterprises, regional listed companies, different vertical industries, public utilities, Government, a vast number of successful SMEs, and consumers in various Asian cities.

About VRX
VRX is a consolidated vulnerability management platform that protects assets in real time. Its rich, integrated features efficiently pinpoint and remediate the largest risks to your cyber infrastructure. Resolve the most pressing threats with efficient automation features and precise contextual analysis.

Enhance Productivity and Security with SafeDNS Schedule

SafeDNS schedule allows organizations to set time-based access policies for their users. With SafeDNS schedule, administrators can easily specify the times during which users are allowed or blocked from accessing certain websites or website categories, improving productivity and compliance.

For example, you can set a schedule that allows access to social media websites during lunch hours only. If an employee tries to access social media outside of the allowed time, they will be redirected to a blocked page.

The benefits of SafeDNS schedule are numerous. Firstly, it helps managers improve employee productivity by ensuring that employees are not wasting time on non-work-related websites during working hours. Additionally, it helps organizations comply with policies and regulations regarding internet usage, ensuring that employees are not accessing inappropriate or illegal content during work hours.

SafeDNS schedule also provides managers with a high degree of flexibility in setting policies for different groups of employees based on their roles, schedules, or other criteria. It can be easily managed and configured through a web-based interface, making it easy for managers to set policies and monitor employee activity.

Overall, SafeDNS schedule is a powerful tool that can help organizations improve employee productivity, maintain compliance, and enhance security.


Start using SafeDNS for free

Take advantage of the SafeDNS trial period and try all the best features

About Version 2 Digital

Version 2 Digital is one of the most dynamic IT companies in Asia. The company distributes a wide range of IT products across various areas including cyber security, cloud, data protection, end points, infrastructures, system monitoring, storage, networking, business productivity and communication products.

Through an extensive network of channels, point of sales, resellers, and partnership companies, Version 2 offers quality products and services which are highly acclaimed in the market. Its customers cover a wide spectrum which include Global 1000 enterprises, regional listed companies, different vertical industries, public utilities, Government, a vast number of successful SMEs, and consumers in various Asian cities.

About SafeDNS
SafeDNS breathes to make the internet safer for people all over the world with solutions ranging from AI & ML-powered web filtering, cybersecurity to threat intelligence. Moreover, we strive to create the next generation of safer and more affordable web filtering products. Endlessly working to improve our users’ online protection, SafeDNS has also launched an innovative system powered by continuous machine learning and user behavior analytics to detect botnets and malicious websites.

×

Hello!

Click one of our contacts below to chat on WhatsApp

×