Skip to content

Commit 7dc76e8

Browse files
author
yangchangpei
committed
安全性升级
1 parent f54488c commit 7dc76e8

File tree

5 files changed

+180
-26
lines changed

5 files changed

+180
-26
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ JDK 1.7 +
3131
<dependency>
3232
<groupId>com.github.core-lib</groupId>
3333
<artifactId>xjar</artifactId>
34-
<version>4.0.1</version>
34+
<version>4.0.2</version>
3535
<!-- <scope>test</scope> -->
3636
</dependency>
3737
</dependencies>
@@ -188,7 +188,7 @@ xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar /path/to/en
188188
<plugin>
189189
<groupId>com.github.core-lib</groupId>
190190
<artifactId>xjar-maven-plugin</artifactId>
191-
<version>4.0.1</version>
191+
<version>4.0.2</version>
192192
<executions>
193193
<execution>
194194
<goals>
@@ -262,6 +262,8 @@ mvn clean install -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/ta
262262
更多文档:[xjar-maven-plugin](https://github.com/core-lib/xjar-maven-plugin)
263263

264264
## 版本记录
265+
* 4.0.2
266+
1. 安全性升级
265267
* 4.0.1
266268
1. 兼容JDK-9及以上版本
267269
* 4.0.0

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>io.xjar</groupId>
88
<artifactId>xjar</artifactId>
9-
<version>4.0.1</version>
9+
<version>4.0.2</version>
1010

1111
<name>xjar</name>
1212

src/main/java/io/xjar/XGo.java

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import java.io.*;
66
import java.net.URL;
77
import java.nio.charset.StandardCharsets;
8+
import java.util.Arrays;
89
import java.util.HashMap;
10+
import java.util.List;
911
import java.util.Map;
1012

1113
/**
@@ -34,31 +36,34 @@ public static void make(File xJar, XKey xKey) throws IOException {
3436
variables.put("xKey.ivsize", convert(ivsize));
3537
variables.put("xKey.password", convert(password));
3638

37-
URL url = XGo.class.getClassLoader().getResource("xjar/xjar.go");
38-
if (url == null) {
39-
throw new IOException("could not find xjar.go");
40-
}
41-
String dir = xJar.getParent();
42-
File src = new File(dir, "xjar.go");
43-
try (
44-
InputStream in = url.openStream();
45-
Reader reader = new InputStreamReader(in);
46-
BufferedReader br = new BufferedReader(reader);
47-
OutputStream out = new FileOutputStream(src);
48-
Writer writer = new OutputStreamWriter(out);
49-
BufferedWriter bw = new BufferedWriter(writer)
50-
) {
51-
String line;
52-
while ((line = br.readLine()) != null) {
53-
for (Map.Entry<String, String> variable : variables.entrySet()) {
54-
line = line.replace("#{" + variable.getKey() + "}", variable.getValue());
39+
List<String> templates = Arrays.asList("xjar.go", "xjar_agentable.go");
40+
for (String template : templates) {
41+
URL url = XGo.class.getClassLoader().getResource("xjar/" + template);
42+
if (url == null) {
43+
throw new IOException("could not find xjar/" + template + " in classpath");
44+
}
45+
String dir = xJar.getParent();
46+
File src = new File(dir, template);
47+
try (
48+
InputStream in = url.openStream();
49+
Reader reader = new InputStreamReader(in);
50+
BufferedReader br = new BufferedReader(reader);
51+
OutputStream out = new FileOutputStream(src);
52+
Writer writer = new OutputStreamWriter(out);
53+
BufferedWriter bw = new BufferedWriter(writer)
54+
) {
55+
String line;
56+
while ((line = br.readLine()) != null) {
57+
for (Map.Entry<String, String> variable : variables.entrySet()) {
58+
line = line.replace("#{" + variable.getKey() + "}", variable.getValue());
59+
}
60+
bw.write(line);
61+
bw.write(CLRF);
5562
}
56-
bw.write(line);
57-
bw.write(CLRF);
63+
bw.flush();
64+
writer.flush();
65+
out.flush();
5866
}
59-
bw.flush();
60-
writer.flush();
61-
out.flush();
6267
}
6368
}
6469

src/main/resources/xjar/xjar.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"os"
1111
"os/exec"
1212
"path/filepath"
13+
"strings"
1314
)
1415

1516
var xJar = XJar{
@@ -55,6 +56,18 @@ func main() {
5556
panic(errors.New("invalid jar with SHA-1"))
5657
}
5758

59+
// check agent forbid
60+
{
61+
args := os.Args
62+
l := len(args)
63+
for i := 0; i < l; i++ {
64+
arg := args[i]
65+
if strings.HasPrefix(arg, "-javaagent:") {
66+
panic(errors.New("agent forbidden"))
67+
}
68+
}
69+
}
70+
5871
// start java application
5972
java := os.Args[1]
6073
args := os.Args[2:]
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"crypto/md5"
6+
"crypto/sha1"
7+
"errors"
8+
"hash"
9+
"io"
10+
"os"
11+
"os/exec"
12+
"path/filepath"
13+
)
14+
15+
var xJar = XJar{
16+
md5: []byte{#{xJar.md5}},
17+
sha1: []byte{#{xJar.sha1}},
18+
}
19+
20+
var xKey = XKey{
21+
algorithm: []byte{#{xKey.algorithm}},
22+
keysize: []byte{#{xKey.keysize}},
23+
ivsize: []byte{#{xKey.ivsize}},
24+
password: []byte{#{xKey.password}},
25+
}
26+
27+
func main() {
28+
// search the jar to start
29+
jar, err := JAR(os.Args)
30+
if err != nil {
31+
panic(err)
32+
}
33+
34+
// parse jar name to absolute path
35+
path, err := filepath.Abs(jar)
36+
if err != nil {
37+
panic(err)
38+
}
39+
40+
// verify jar with MD5
41+
MD5, err := MD5(path)
42+
if err != nil {
43+
panic(err)
44+
}
45+
if bytes.Compare(MD5, xJar.md5) != 0 {
46+
panic(errors.New("invalid jar with MD5"))
47+
}
48+
49+
// verify jar with SHA-1
50+
SHA1, err := SHA1(path)
51+
if err != nil {
52+
panic(err)
53+
}
54+
if bytes.Compare(SHA1, xJar.sha1) != 0 {
55+
panic(errors.New("invalid jar with SHA-1"))
56+
}
57+
58+
// start java application
59+
java := os.Args[1]
60+
args := os.Args[2:]
61+
key := bytes.Join([][]byte{
62+
xKey.algorithm, {13, 10},
63+
xKey.keysize, {13, 10},
64+
xKey.ivsize, {13, 10},
65+
xKey.password, {13, 10},
66+
}, []byte{})
67+
cmd := exec.Command(java, args...)
68+
cmd.Stdin = bytes.NewReader(key)
69+
cmd.Stdout = os.Stdout
70+
cmd.Stderr = os.Stderr
71+
err = cmd.Run()
72+
if err != nil {
73+
panic(err)
74+
}
75+
}
76+
77+
// find jar name from args
78+
func JAR(args []string) (string, error) {
79+
var jar string
80+
81+
l := len(args)
82+
for i := 1; i < l-1; i++ {
83+
arg := args[i]
84+
if arg == "-jar" {
85+
jar = args[i+1]
86+
}
87+
}
88+
89+
if jar == "" {
90+
return "", errors.New("unspecified jar name")
91+
}
92+
93+
return jar, nil
94+
}
95+
96+
// calculate file's MD5
97+
func MD5(path string) ([]byte, error) {
98+
return HASH(path, md5.New())
99+
}
100+
101+
// calculate file's SHA-1
102+
func SHA1(path string) ([]byte, error) {
103+
return HASH(path, sha1.New())
104+
}
105+
106+
// calculate file's HASH value with specified HASH Algorithm
107+
func HASH(path string, hash hash.Hash) ([]byte, error) {
108+
file, err := os.Open(path)
109+
110+
if err != nil {
111+
return nil, err
112+
}
113+
114+
_, _err := io.Copy(hash, file)
115+
if _err != nil {
116+
return nil, _err
117+
}
118+
119+
sum := hash.Sum(nil)
120+
121+
return sum, nil
122+
}
123+
124+
type XJar struct {
125+
md5 []byte
126+
sha1 []byte
127+
}
128+
129+
type XKey struct {
130+
algorithm []byte
131+
keysize []byte
132+
ivsize []byte
133+
password []byte
134+
}

0 commit comments

Comments
 (0)